# 定义
有时候你会比 Typescript
更了解你的值的类型, Typescript
允许你使用你想要的方式分析并覆盖它, 这种机制被称为 「类型断言」。
# 使用
类型断言有 两种形式:
# as
const someValue: any = "this is a string";
const strLength: number = (someValue as string).length;
1
2
3
2
3
# <> 尖括号
const someValue: any = "this is a string";
const strLength: number = (<string>someValue).length;
1
2
3
2
3
Note: 当你在 .jsx
or
.tsx
中使用 尖括号 的方式进行类型断言时, 会造成 语言歧义, 为了保持一致性, 推荐使用 as
语法来进行 类型断言。相关体验 (opens new window)
# 双重断言
原理: 任何类型都可以被断言为 any
, 而 any
可以被断言为任何类型。
interface Person {
name: string;
}
const mine = 'Rain120';
((age as any) as Person).name;
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Note: 双重断言极具破坏性, 而且它很可能会导致运行时错误, 慎用 !!!
# ! 后缀类型断言
我们知道 Nullable
类型实质上是 联合类型, 那么同样面临类型缩窄的问题。对此, TypeScript
也提供了符合直觉的类型保护。
自动类型保护无法处理的场景可以通过 !
后缀来去除 Nullable
部分, 即 null | undefined
。
interface Profile {
name: string;
age?: number | string;
}
function getParentInfo(profile: Profile): number | string {
return profile!.age!;
}
1
2
3
4
5
6
7
2
3
4
5
6
7
更多操作符相关, 请到 Here
# 类型断言 与 类型转换
在计算机科学中, 类型转换 (type conversion) (opens new window) 是指将数据从一种类型 转换成 另一种类型的过程。所以 类型转换 是在 运行时 转换的, 而 类型断言 只是一个编译时的语法, 为编译器提供关于如何分析代码的方法。
若要进行类型转换, 需要直接调用类型转换的方法:
Boolean();
String();
parseInt();
// etc...
1
2
3
4
5
6
7
2
3
4
5
6
7
# 断言判断
C类型 是 P类型 的 子类型
P类型 是 C类型 的 子类型
C类型 能被断言为 P类型。
# 快来耍耍啊
# 🌰🌰
请解决👇👇👇报错
interface Profile {
name: string;
age: number | string;
}
const author = {};
// Property 'name' does not exist on type '{}'.(2339)
author.name = 'Rain120';
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 游乐场
# 参考答案
interface Profile {
name: string;
age: number | string;
}
const author = {} as Profile;
// const author = <Profile>{};
author.name = 'Rain120';
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 参考资料
Handbook - type-assertion (opens new window)