7

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

1 回答 1

7

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

interface IFoo { X: number }
interface IBar { X: number; Y: number }

是否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

Object如果您将其视为空接口,那么在 Typescript 中,所有类型都兼容。通过这种方式,您可以将任何有效的 typescript 值传递给接受Object并很好地使用 Javascript 库的编写方式的函数。

我建议阅读文档中的Type Compatibility以及关于Subtype vs Assignment的最后一段。

于 2016-09-18T21:41:59.063 回答