TS基础
类型
- JS的运行时类型 Boolean Number String undefind null Bigint Symbol ts都支持
- 复杂类型** Class Array** 元组( Tuple ) 接口( Interface )枚举( Enum )
- 特殊类型
- 模板字面量定义类型
1
let str: `#${string}` = '#str' // 匹配 # 开头的字符串 - never 代表不可达,比如函数抛异常的时候,返回值就是 never。
- void 代表空,可以是 undefined 或 never。
- any 是任意类型,任何类型都可以赋值给它,它也可以赋值给任何类型(除了 never)。
- unknown 是未知类型,任何类型都可以赋值给它,但是它不可以赋值给别的类型。
- 模板字面量定义类型
- Type 和 interface的区别
- type可以 定义基本类型的别名 ,如 type myString = string
- interface可以 声明合并 ,这种情况下,如果是type的话,就会报 重复定义 的警告
- 用interface描述 数据结构 ,用type描述类型关系
- 类型层级 never - 1 | 2 | “3” - string - String - Object - any / unknow
类型运算
-
extends
- 条件判断 一般用于动态类型的判断
1
2
3type isString<T> = T extends string ? true : false;
type res_False = isString<1> // false
type res_True = isString<'1'> // true - 对类型进行约束(第一个extends)
1
2type ExampleType<T extends string> = T extends "5" ? true : false
type isFive = ExampleType<'4'> // false
- 条件判断 一般用于动态类型的判断
-
infer
1
2type FirstType<Tuple extends unknown[]> = Tuple extends [infer T, ...infer rest] ? T : never; // 提取第一个的类型
type res = FirstType<[string, number, boolean]>; // string -
联合 | 交叉 &
1
2
3
4
5
6
7
8
9
10// 联合
type NumberType = 1 | 2 | 3 | 4
let one:NumberType = 5 // error: 不能将类型“5”分配给类型“NumberType”。
// 交叉
type NumOrStrType = { num: number } & { str: string }
let foo: NumOrStrType = {
num: 1,
str: 'str'
} -
keyof
keyof T 是查询索引类型中所有的索引,叫做索引查询。T[Key] 是取索引类型某个索引的值,叫做
索引访问。in 是用于遍历联合类型的运算符。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23// 修改值
type MapType<T> = {
[key in keyof T]: [T[key]]
}
type res_Map = MapType<{ num: number, str: string }>
//type res_Map = {
// num: [number];
// str: [string];
// }
// 修改索引
type MapType<T> = {
[key in keyof T as `my${key & string}`]: [T[key]]
}
type res_Map = MapType<{ num: number, str: string }>
// type res_Map = {
// mynum: [number];
// mystr: [string];
// }
// 遍历
type Ref<Props> = keyof Props
type res_Union = Ref<{ ref?: undefined, props: string }> // type res_Union = "ref" | "props"& string操作
因为索引类型(对象、class 等)可以用 string、number 和 symbol 作为 key,这里 keyof T 取出的索引就是 string | number | symbol 的联合类型,和 string 取交叉部分就只剩下 string 了。
TS基础
https://jing-jiu.github.io/jing-jiu/2022/10/10/notebooks/TS类型体操/(一)基础/