# 定义

有时候你会比 Typescript 更了解你的值的类型, Typescript 允许你使用你想要的方式分析并覆盖它, 这种机制被称为 「类型断言」

# 使用

类型断言有 两种形式:

# as

const someValue: any = "this is a string";

const strLength: number = (someValue as string).length;
1
2
3

# <> 尖括号

const someValue: any = "this is a string";

const strLength: number = (<string>someValue).length;
1
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

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

更多操作符相关, 请到 Here

# 类型断言 与 类型转换

在计算机科学中, 类型转换 (type conversion) (opens new window) 是指将数据从一种类型 转换成 另一种类型的过程。所以 类型转换 是在 运行时 转换的, 而 类型断言 只是一个编译时的语法, 为编译器提供关于如何分析代码的方法。

若要进行类型转换, 需要直接调用类型转换的方法:

Boolean();

String();

parseInt();

// etc...
1
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

# 游乐场


# 参考答案


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

# 参考资料

Handbook - type-assertion (opens new window)

深入理解 Typescript (opens new window)

Typescript - type-assertion (opens new window)