TypeScript:为什么一个数字可分配给Object类型的引用?

Rol*_*oly 7 primitive coercion subtyping typescript

为什么这是合法的TypeScript?

var x: number = 5
var y: Object = x
Run Code Online (Sandbox Code Playgroud)

肯定有一个数字不是Object.有人可能怀疑x被隐式强制(自动装箱)到一个对象,但没有:

if (!(y instanceof Object)) {
   console.log(typeof y)
}
Run Code Online (Sandbox Code Playgroud)

版画

number
Run Code Online (Sandbox Code Playgroud)

作为记录:

$ tsc --version
Version 1.8.10
Run Code Online (Sandbox Code Playgroud)

kro*_*nis 7

TypeScript中的类型兼容性基于结构子类型,而不是名义类型.也就是说,考虑以下两个接口定义:

interface IFoo { X: number }
interface IBar { X: number; Y: number }
Run Code Online (Sandbox Code Playgroud)

是否IBar延长IFoo?没有.

但是IFoo兼容IBar吗?是.

成员IFoo是一个子集IBar的成员,因此你可以将任意IBarIFoo.但它反过来不起作用:

var x: IFoo;
var y: IBar;

x = y // all good
y = x // type error, x has no Y member
Run Code Online (Sandbox Code Playgroud)

这种方式在Typescript中,Object如果您将其视为空接口,则所有类型都是兼容的.通过这种方式,您可以将任何有效的typescript值传递给函数,以接受Object和编写Javascript库的方式.

我建议阅读文档中的类型兼容性和关于子类型与分配的最后一段.