看来不应该允许...
let wow = {} as boolean //No errors O.O
let wow2 = {} as [] //No errors O.O
let wow3 = {} as Function //No errors O.O
let wow4 = {} as number //No errors O.O
let wow5 = {} as string //No errors O.O
let wow6 = {} as symbol //No errors O.O
看来不应该允许...
let wow = {} as boolean //No errors O.O
let wow2 = {} as [] //No errors O.O
let wow3 = {} as Function //No errors O.O
let wow4 = {} as number //No errors O.O
let wow5 = {} as string //No errors O.O
let wow6 = {} as symbol //No errors O.O
空对象类型一开始有点奇怪。
所以,首先,打字稿是结构性的。这意味着
{}
描述了一个需要零个属性的类型。因此,几乎任何东西都可以分配,{}
因为几乎每种类型都可以满足具有全零所需属性的结构类型契约。其次,
as
本质上不是类型安全的。类型断言 using
as
告诉 Typescript 您比编译器更了解,并且您希望将编译器使用的类型缩小到只有您知道的更具体的类型。因此,考虑到由于上面的第一点,它
boolean
是可分配的,因此{}
它允许类型断言。as
重要的教训:除非您确定自己是对的,否则不要使用。作为记录,以下内容也将起作用:
这一切都是因为 TS 具有结构子类型。
在结构子类型中,类型兼容性基于结构。这与必须明确定义的名义子类型不同。
基本上,对于上述情况要记住的是:
对于上述空对象类型
{}
,条件确实适用。正如注释中所添加的,空对象将只接受除 null/未定义之外的任何内容。
相关 Github 问题: 1