数组中既有 number 类型,又有 string 类型,这个数组的类型应该如何写?
let arr: (number | string)[] = [1, 'a', 3, 'b']
联合类型
概念:将多个类型合并为一个类型对变量进行注解
解释:|
(竖线)在 TS 中叫做联合类型,即:由两个或多个其他类型组成的类型,表示可以是这些类型中的任意一种
注意:这是 TS 中联合类型的语法,只有一根竖线,不要与 JS 中的或(|| 或)混淆了
类型断言
有时候你会比 TS 更加明确一个值的类型,此时,可以使用类型断言(as)来指定更具体的类型
应用场景:把一个大类型 缩小 为更加具体的类型
格式:类型 as 具体类型
使用类型断言:
//const a:HTMLAnchorElement
const a = document.getElementById('link') as HTMLAnchorElement
解释:
- 使用
as
关键字实现类型断言 - 关键字 as 后面的类型是一个更加具体的类型(HTMLAnchorElement 是 HTMLElement 的子类型)
- 通过类型断言,aLink 的类型变得更加具体,这样就可以访问 a 标签特有的属性或方法了
拓展非空断言
对可能为 null
或 undefined
的值进行操作或访问属性时可以使用非空断言来告诉编译器,确保其不为空。
它使用一个感叹号 !
在表达式后面进行表示。
const name: string | null = getName();
console.log(name!.toUpperCase()); // 使用非空断言告诉编译器 name 不为空
注意的是,非空断言会绕过 TypeScript 对类型的检查,因此滥用非空断言可能导致运行时错误。