为什么空对象可以断言任何类型?

问题描述 投票:0回答:2

看来不应该允许...

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
typescript
2个回答
1
投票

作为记录,以下内容也适用:

let wow : {} = '2';
let wow2 : {} = 2;
let wow3 : {} = true;
let wow4 : {} = { a : 1};

这一切都是因为 TS 具有结构子类型

基本上,要记住的是:

  1. 所有字段都应该退出
  2. 额外的字段很好,
  3. 但不正确的字段(相同字段名称但类型不同)则不然。

对于上述空对象类型,条件确实适用。


1
投票

空对象类型一开始有点奇怪。

所以,首先,打字稿是结构性的。这意味着

{}
描述了一个需要零个属性的类型。因此,几乎任何东西都可以分配给
{}
,因为几乎每种类型都可以满足具有“全零”所需属性的结构类型契约。

其次,
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

    

© www.soinside.com 2019 - 2024. All rights reserved.