- TypeScript 简介与优势
- TypeScript 安装与使用
- TypeScript 变量声明
- TypeScript 基础类型
- TypeScript BigInt
- TypeScript Symbol
- TypeScript 元组(Tuple)
- TypeScript 枚举(Enum)
- TypeScript Never 与 Unknown
- TypeScript 接口(Interface)
- TypeScript 类(Class)
- TypeScript 函数(Function)
- TypeScript 字面量类型
- TypeScript 类型推断
- TypeScript 类型断言
- TypeScript 类型保护
- TypeScript 泛型(Generic)
- TypeScript 类型兼容性
- TypeScript 交叉类型
- TypeScript 联合类型
- TypeScript 类型别名
- TypeScript 索引类型
- TypeScript 映射类型
- TypeScript 条件类型
- TypeScript is 关键字
- TypeScript infer 关键字
- TypeScript Truthy 与 Falsy
- TypeScript 迭代器(Iterator)
- TypeScript 生成器(Generator)
- TypeScript 装饰器(Decorator)
- TypeScript Reflect Metadata
- TypeScript 混入(Mixins)
- TypeScript 模块
- TypeScript 命名空间
- TypeScript 声明合并
- TypeScript 编译选项
- TypeScript tsconfig.json 配置
- TypeScript TSLint 与 ESLint
TypeScript 类型断言
本节介绍类型断言,有使用关键字 as
和标签 <>
两种方式,因后者会与JSX
语法冲突,建议统一使用 as
来进行类型断言。
1. 慕课解释
TypeScript 允许你覆盖它的推断,毕竟作为开发者你比编译器更了解你写的代码。
类型断言主要用于当 TypeScript 推断出来类型并不满足你的需求,你需要手动指定一个类型。
2. 关键字 as
当你把 JavaScript 代码迁移到 TypeScript 时,一个常见的问题:
const user = {}
user.nickname = 'Evan' // Error, Property 'nickname' does not exist on type '{}'
user.admin = true // Error, Property 'admin' does not exist on type '{}'
代码解释: 编译器推断 const user: {}
,这是一个没有属性的对象,所以你不能对其添加属性。
此时可以使用类型断言(as关键字)覆盖其类型推断:
interface User {
nickname: string,
admin: boolean,
groups: number[]
}
const user = {} as User
user.nickname = 'Evan'
user.admin = true
user.groups = [2, 6]
代码解释:
第 7 行,这里通过 as
关键字进行类型断言,将变量 user
的类型覆盖为 User
类型。但是请注意,类型断言不要滥用,除非你完全明白你在干什么。
3. 首尾标签
类型断言还可以通过标签 <>
来实现:
interface User {
nickname: string,
admin: boolean,
groups: number[]
}
const user = <User>{} // User类型
user.nickname = 'Evan'
user.admin = true
user.groups = [2, 6]
代码解释:
第 7 行,使用 <User>{}
这种标签形式,将变量 user 强制断言为 User 类型。
但是,当你在使用 JSX
语法时,会跟标签 <>
形式的类型断言混淆:
let nickname = <User>Evan</User> // 这里的 User 指向一个 component
所以,建议统一使用 as type
这种语法来为类型断言。
4. 非空断言 !
如果编译器不能够去除 null 或 undefined,可以使用非空断言 !
手动去除。
function fixed(name: string | null): string {
function postfix(epithet: string) {
return name!.charAt(0) + '. the ' + epithet; // name 被断言为非空
}
name = name || "Bob"
return postfix("great")
}
代码解释:
第 2 行,postfix()
是一个嵌套函数,因为编译器无法去除嵌套函数的 null (除非是立即调用的函数表达式),所以 TypeScript 推断第 3 行的 name
可能为空。
第 5 行,而 name = name || "Bob"
这行代码已经明确了 name
不为空,所以可以直接给 name 断言为非空(第 3 行)。
5. 双重断言
双重断言极少有应用场景,只需要知道有这种操作即可:
interface User {
nickname: string,
admin: boolean,
group: number[]
}
const user = 'Evan' as any as User
代码解释: 最后一行,使用 as 关键字进行了两次断言,最终变量 user 被强制转化为 User 类型。
6. 小结
本节介绍了几种类型断言的方法,需要注意:
- 慎用类型断言,除非你真的有把握。
- 类型断言是一个编译时语法,不涉及运行时。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论