那么显然我需要首先将组件中的教师数组更改为界面的实例?
没有这样的事情接口的一个实例。接口是抽象的,它们仅存在于 TypeScript 中,甚至不能编译为 JavaScript。您编写它们是为了在编辑器中获得代码补全和其他好处;在大型应用程序中为您提供帮助,因此您不必记住每个对象具有哪些属性和方法。
当您必须实例化一个对象时,接口无法做到这一点 - 您将使用一个类,并像往常一样创建属性和方法。在您的示例中执行此操作的正确方法是:
interface ITeacher{
id: string,
name: string,
students: Array<Student>;
};
class Teacher implements ITeacher {
id: string,
name: string,
students: Array<Student>;
}
在您的情况下,不需要实现接口,TypeScript 也足够智能,可以从类中提取信息,因此这些是相同的:
teachers: Teacher[];
teachers: ITeacher[];
如果您有多种类型的教师,并且您想确保每一位教师都具有所有必要的属性/方法,那么创建一个接口是有意义的:
class FirstGradeTeacher implements ITeacher{}
class SecondGradeTeacher implements ITeacher{}
您可能已经注意到我根本没有提到 JSON。忘掉它!...使用对象模型(类或接口)时。它只是逻辑模型的数据格式。当您构建模型并规划它们如何工作时,您并不关心协议和格式(Http 服务处理这些)。
getTeachers(): Observable<Teacher> {
return this.http.get('someUrl')
.map((res: Response) => res.json())
}
这段代码是您使用接口的方式。你只需告诉 TypeScript 当你收到响应时someUrl
并将其解析为json
您期望数据的类型为 Teacher。
然后在其他地方当你subscribe()
对它来说,它可以告诉你你得到的对象有id
, name
and students
特性:
this._service.getTeachers()
.subscribe((teachers: Teacher[]) => this.teachers = teachers);
希望这可以帮助 (: