为什么这是合法的TypeScript?
var x: number = 5
var y: Object = x
肯定一个数字不是Object
。有人可能怀疑x被隐式强制(自动装箱)到一个对象,但没有:
if (!(y instanceof Object)) {
console.log(typeof y)
}
打印
number
记录:
$ tsc --version
Version 1.8.10
答案 0 :(得分:7)
TypeScript中的类型兼容性基于结构子类型,而不是名义类型。也就是说,考虑以下两个接口定义:
interface IFoo { X: number }
interface IBar { X: number; Y: number }
IBar
是否会延长IFoo
?没有。
但IFoo
是否与IBar
兼容?是。
IFoo
成员是IBar
成员的子集,因此您可以将IBar
分配给IFoo
。但它反过来不起作用:
var x: IFoo;
var y: IBar;
x = y // all good
y = x // type error, x has no Y member
这种方式在Typescript中,如果您将其视为空接口,则所有类型都与Object
兼容。这样,您可以将任何有效的typescript值传递给接受Object
的函数,并且可以很好地处理Javascript库的编写方式。
我建议在文档中阅读Type Compatibility以及关于子类型与分配的最后一段。