为什么这是合法的 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
为什么这是合法的 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
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
Object
如果您将其视为空接口,那么在 Typescript 中,所有类型都兼容。通过这种方式,您可以将任何有效的 typescript 值传递给接受Object
并很好地使用 Javascript 库的编写方式的函数。
我建议阅读文档中的Type Compatibility以及关于Subtype vs Assignment的最后一段。