2016-09-18 66 views
6

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

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 

回答

6

类型兼容性是基于结构子类型,而不是标称键入。这就是说,可以考虑以下两个接口定义:

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 

这样的打字稿如果你认为它是空的接口的所有类型与Object兼容。通过这种方式,您可以将任何有效的打字稿值传递给接受Object的函数,并且可以很好地使用JavaScript库编写的方式。

我建议阅读Type Compatibility在文档和最后一段约子类型与作业

+1

好的,这就是我期待的解释(注意到我也可以将bool分配给我定义的空白接口,称为Bool,它与Object同构)。我了解结构性和名义性,但没有预料它适用于非参考类型。我想这只是对于Object真正具有空接口的程度而言的(鉴于对于一个对象我可以做的事情可能是我无法对数字或原始字符串做的事情)。 – Roly

+0

我很高兴解释,所以我接受了答案。原来我被咬了,不是因为数字<对象(这似乎是好的,模我上面的警告),但因为函数类型的子类型似乎borked。这里有一个新问题:http://stackoverflow.com/questions/39569016。 – Roly

+1

我想这里的数字 Roly

相关问题