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

时间:2016-09-18 20:30:18

标签: typescript primitive coercion subtyping

为什么这是合法的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

1 个答案:

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