TypeScript:为什么数字可以分配给对象类型的引用?
TypeScript: why is a number assignable to a reference of type Object?
为什么这是合法的 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
如果您将其视为空接口,那么在 Typescript 中所有类型都与 Object
兼容。通过这种方式,您可以将任何有效的打字稿值传递给接受 Object
的函数,并且可以很好地使用 Javascript 库的编写方式。
我建议阅读文档中的 Type Compatibility 以及关于 子类型与分配 的最后一段。
为什么这是合法的 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
如果您将其视为空接口,那么在 Typescript 中所有类型都与 Object
兼容。通过这种方式,您可以将任何有效的打字稿值传递给接受 Object
的函数,并且可以很好地使用 Javascript 库的编写方式。
我建议阅读文档中的 Type Compatibility 以及关于 子类型与分配 的最后一段。