Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript http响应后的Angular 9类型转换问题_Javascript_Arrays_Angular_Typescript_Observable - Fatal编程技术网

Javascript http响应后的Angular 9类型转换问题

Javascript http响应后的Angular 9类型转换问题,javascript,arrays,angular,typescript,observable,Javascript,Arrays,Angular,Typescript,Observable,我有一个组件,它在初始化时从api检索学生信息。 这是我的cmponent-version1上的onIniti代码 这是我的student-service-version1中的函数 这不起作用,因此在初始化之后,student变量仍然未定义。我不明白为什么,对我来说一切似乎都是正确的,尽管这不是一个好主意。再说一次,我只是想了解背后的错误 我也会尝试 this.student=response.pop作为学生;同样的结果,不起作用 你的服务人员现在应该对你大喊大叫,因为你在对编译器撒谎。。。您的

我有一个组件,它在初始化时从api检索学生信息。 这是我的cmponent-version1上的onIniti代码

这是我的student-service-version1中的函数

这不起作用,因此在初始化之后,student变量仍然未定义。我不明白为什么,对我来说一切似乎都是正确的,尽管这不是一个好主意。再说一次,我只是想了解背后的错误 我也会尝试
this.student=response.pop作为学生;同样的结果,不起作用

你的服务人员现在应该对你大喊大叫,因为你在对编译器撒谎。。。您的返回类型不可观察其可观察。。。我完全不同意single和list Get的一个函数的原理,但是你可以强迫它在单一情况下成为一个list

return this.httpClient.get<Student>(`${this.studentsUrl}${id}/`, this.baseService.httpOptions).pipe(
  map(student => [student])
);

如果某个内容不是数组,则任何类型转换都不会将其转换为数组。如果您想要的话,您需要显式地将其设置为数组。

您的服务现在应该对您大喊大叫,因为您在对编译器撒谎。。。您的返回类型不可观察其可观察。。。我完全不同意single和list Get的一个函数的原理,但是你可以强迫它在单一情况下成为一个list

return this.httpClient.get<Student>(`${this.studentsUrl}${id}/`, this.baseService.httpOptions).pipe(
  map(student => [student])
);

如果某个内容不是数组,则任何类型转换都不会将其转换为数组。如果需要,您需要显式地将其设置为数组。

按如下方式重载方法的签名:

class StudentService {
  get(id: number) | Observable<Student>;
  get(): Observable<Student[]>;
  get(id: number | undefined): Observable<Student[]> | Observable<Student> {
    if(id !== undefined)
      return this.httpClient.get<Student[]>(`${this.studentsUrl}${id}/`, this.baseService.httpOptions);
    else
      return this.httpClient.get<Student>(this.studentsUrl, this.baseService.httpOptions);
  }
} 

请注意,该方法如何被重命名以在任何情况下都有意义,返回类型如何与id参数的存在相关联,以及检查如何被修改以适应0作为有效id的可能性。

重载方法的签名,如下所示:

class StudentService {
  get(id: number) | Observable<Student>;
  get(): Observable<Student[]>;
  get(id: number | undefined): Observable<Student[]> | Observable<Student> {
    if(id !== undefined)
      return this.httpClient.get<Student[]>(`${this.studentsUrl}${id}/`, this.baseService.httpOptions);
    else
      return this.httpClient.get<Student>(this.studentsUrl, this.baseService.httpOptions);
  }
} 
ngOnInit(): void {
if(!this.student) {
  this.studentsService.getStudents(this.id).subscribe(
    (response: Student[]) => {
      // Hope, this.student will have type as any, public student: any
      this.student = !this.id ? response[0] as Student : response as Student[];
    },
    error => console.log(error)
  )
}
请注意,该方法如何被重命名以在任何情况下都有意义,返回类型如何与id参数的存在相关联,以及检查如何被修改以适应0作为有效id的可能性

ngOnInit(): void {
if(!this.student) {
  this.studentsService.getStudents(this.id).subscribe(
    (response: Student[]) => {
      // Hope, this.student will have type as any, public student: any
      this.student = !this.id ? response[0] as Student : response as Student[];
    },
    error => console.log(error)
  )
}
}

始终尝试返回数组以避免冲突。在上述代码中, 三元运算符将完成您的工作。如果你有身份证的话 意思是你在询问特定的学生信息,否则你会 我们要求所有的学生记录

}

始终尝试返回数组以避免冲突。在上述代码中, 三元运算符将完成您的工作。如果你有身份证的话 意思是你在询问特定的学生信息,否则你会 我们要求所有的学生记录


反应如何?你在哪里检查学生变量?因为您的作业student=response[0]位于订阅中,这是使用调试器异步执行的。在onInit之后的版本1中,学生是正常的,而版本2则是正常的undefined@brkconsole.logresponse打印如下:{id:18,cf:ciaciacia,名字:Paolo,姓氏:Bianchi,出生日期:2020-05-01,…}正如预期的那样,这是学生信息。反应看起来如何?你在哪里检查学生变量?因为您的作业student=response[0]位于订阅中,这是使用调试器异步执行的。在onInit之后的版本1中,学生是正常的,而版本2则是正常的undefined@brkconsole.logresponse打印:{id:18,cf:ciaciacia,名字:Paolo,姓氏:Bianchi,出生日期:2020-05-01,…}正如预期的那样,这是学生信息。很抱歉,这是一个问题的输入错误。我已经改正了。现在它看起来像是在我的编辑器中,getStudent以两种方式返回一个Student数组。如果响应实际上是一个Student数组?您有响应本身的示例JSON吗?在get中插入类型实际上不会改变响应的任何内容。它只是告诉智能感知它是什么。Typecasting在typescript中除了告诉编译器发生了什么以外,什么都不做。编译器不知道你是否在撒谎,因为你的代码片段起了作用,所以我接受它作为答案。尽管如此,我还是不明白为什么我需要一个映射,而我不能仅仅从StudentArray中提取Student类型的元素,因为实际的响应不是数组,如果不是数组,就不能将内容键入数组。不仅如此,类型转换只适用于开发人员。typescript无法提前知道服务器实际响应的内容。它不能自动地将事物塑造成你所说的你希望它们成为的样子。很抱歉,这是一个问题上的错误。我已经改正了。现在它看起来像是在我的编辑器中,getStudent以两种方式返回一个Student数组。如果响应实际上是一个Student数组?您有响应本身的示例JSON吗?在get中插入类型实际上不会改变响应的任何内容。它只是告诉智能感知它是什么。Typecasting在typescript中除了告诉编译器发生了什么以外,什么都不做。编译器不知道你是否在撒谎。你的代码片段起了作用,所以我接受它为answ
呃。尽管如此,我还是不明白为什么我需要一个映射,而我不能仅仅从StudentArray中提取Student类型的元素,因为实际的响应不是数组,如果不是数组,就不能将内容键入数组。不仅如此,类型转换只适用于开发人员。typescript无法提前知道服务器实际响应的内容。它不能自动地将事物塑造成你所说的你想要的样子。是的,我甚至没有考虑过0的情况。谢谢是的,我甚至没有考虑过0的案子。非常感谢。
ngOnInit(): void {
if(!this.student) {
  this.studentsService.getStudents(this.id).subscribe(
    (response: Student[]) => {
      // Hope, this.student will have type as any, public student: any
      this.student = !this.id ? response[0] as Student : response as Student[];
    },
    error => console.log(error)
  )
}