看来不应该允许...
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 : {} = '2';
let wow2 : {} = 2;
let wow3 : {} = true;
let wow4 : {} = { a : 1};
这一切都是因为 TS 具有结构子类型。
基本上,要记住的是:
对于上述空对象类型,条件确实适用。
空对象类型一开始有点奇怪。
所以,首先,打字稿是结构性的。这意味着
{}
描述了一个需要零个属性的类型。因此,几乎任何东西都可以分配给 {}
,因为几乎每种类型都可以满足具有“全零”所需属性的结构类型契约。
其次,as
本质上不是类型安全的。
declare const strOrNull: string | null
const str: string = strOrNull as string // TS says fine, but really it might be null!
str.split(' ') // TS says fine, but maybe a crash
使用
as
的类型断言告诉 Typescript 您比编译器更了解,并且您想要
缩小编译器正在使用的类型。 因此,由于上述第一点,
{}
是
boolean
的子类型,因此它允许类型断言。
重要的教训:除非您确定自己是对的,否则不要使用as
。