断言

双重断言

如果在使用类型断言时,原类型与断言类型之间差异过大,TypeScript 会给你一个类型报错。

const str: string = "aaa";
(str as { handler: () => {} }).handler() // 从 X 类型 到 Y 类型的断言可能是错误的

此时它会提醒你先断言到 unknown 类型,再断言到预期类型。

const str: string = "aaa";
(str as unknown as { handler: () => {} }).handler();

这是因为你的断言类型和原类型的差异太大,需要先断言到一个通用的类,即 any / unknown 这两个包含了所有可能的类型的通用类型。

断言的原理

类型断言的工作原理和类型层级有关,在判断断言是否成立,即差异是否能接受时,实际上判断的即是这两个类型是否能够找到一个公共的父类型。比如 {}{ name: string } 其实可以认为拥有公共的父类型 {}

如果找不到具有意义的公共父类型呢?这个时候就需要请出 Top Type 了,如果我们把它先断言到 Top Type,那么就拥有了公共父类型 Top Type,再断言到具体的类型也是同理。