在尝试找出将http调用的json响应转换为TypeScript类/接口的最佳方法时,我在堆栈溢出时发现了此代码段。
getTeachers(): Observable<Teacher> {
return this.http.get('someUrl')
.map((res: Response) => res.json())
}
看起来不错,但是我不明白它是如何工作的。
any
类型res.json()
的更具体的类型Teacher
?Teacher
将其作为TypeScriptinterface
而不是TypeScript class
?我将根据@Sasxa的回答和通过其他渠道收到的输入回答我自己的问题。我的重点是向有使用强类型语言的背景的人们解释它。
任何
首先,您可能会假设any
所有类型都是超级类型。就是这种情况!Any
可用于引用任何实例。
打字稿规范还定义了任何可分配于所有类型。根据定义,这可能是javascript interop。从规格:
“ Any类型是所有类型的超类型,并且可以分配给所有类型,也可以从所有类型中分配。”
任何作为通用参数
静态类型语言也具有“协方差”和“逆方差”的概念。将通用参数用作输出类型时,可以将其替换为基本类型(协方差)。例如:“字符串的迭代器”可以分配给“对象的迭代器”。当泛型参数用作输入类型时,可以用它代替派生类型(相反)。
因为any
可以从所有类型分配给所有类型,所以对于参数化类型也是如此。Observable<Teacher>
因此可以从和转换为Observable<any>
。
类型断言
TypeScript类型断言可用于更改实例的感知类型。由于TypeScript是一种结构化类型的语言,因此类型描述了实例的结构,但是实例本身并不知道该类型(在断言中使用)。在声明类型时,我们不应使用除实例成员以外的其他成员的类型。在的情况下,res.json()
例如,我们不期望的类型有方法的成员,因为它是通过一个HTTP GET调用检索到的数据。类型是类还是接口都没有关系。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句