TypeScript:为啥数字可以分配给 Object 类型的引用?
Posted
技术标签:
【中文标题】TypeScript:为啥数字可以分配给 Object 类型的引用?【英文标题】:TypeScript: why is a number assignable to a reference of type Object?TypeScript:为什么数字可以分配给 Object 类型的引用? 【发布时间】:2017-01-26 12:10:02 【问题描述】:为什么这是合法的 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】: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 以及关于子类型与分配的最后一段。
【讨论】:
好的,这基本上就是我所期待的解释(在注意到我也可以将一个 bool 分配给我定义的名为 Bool 的空接口,它与 Object 同构)。我了解结构与名义,但没想到它适用于非引用类型。我想这只是在 Object 真正有一个空接口的程度上是合理的(考虑到我可能对一个对象做一些我不能对数字或原始字符串做的事情)。 我对这个解释很满意,所以我接受了这个答案。原来我被咬不是因为 number ***.com/questions/39569016。 我想这是一种感觉,其中 number 我真的理解你的反对意见(不能不同意 TypeScript 的类型系统存在一些不合理的情况),但通常答案是(无论好坏),它启用了 Javascript 中常见的模式 :) 检查还有function bivariance 在文档中。以上是关于TypeScript:为啥数字可以分配给 Object 类型的引用?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Typescript 允许将 `a: 1, b: 2` 分配给类型 `a: any | b:任何`? [复制]
为啥自定义子查询类型不能分配给 GraphQLObjectType?
打字稿 - 类型'值:数字;日期:日期; ' 不可分配给类型 'Record[]'。 ts(2322)