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?没有。

但是 IFooIBar 兼容吗?是的。

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 以及关于 子类型与分配 的最后一段。