A 是否是 T 类型?
其实就是 A extends T ? true : false
T[number]
当T是数组类型时,T[number] 表示的是数组里的每个元素的类型。
type Foo = ['a', 'b', 'c']
type FooType = Foo[number] // 'a' | 'b' | 'c'
当T是对象类型时,T[number] 表示对象中属性的类型。比如:
interface Foo1 {
[key: string]: number | string | symbol; // 必须要有这个
x: string;
y: number;
}
type FooType = Foo1[number] // string | number | symbol
但是需要注意的是,对对象类型使用 T[number] 时,必须要有索引签名
对象类型,想获取属性的类型时,也可以这样
type ObjType = {
name: string,
age: number
}
// string | number
type Keys = ObjType[keyof ObjType]
数组至少一个元素
一般的比如 sting[] 表示0到多个,那么至少一个,就是 [string, ...string[]]
字符串类型的匹配
字符换的提取,都可以先考虑通过构造局部字符串的方式,然后不断拆分。
// 根据给定的分隔符(Delimiter)对包含分隔符的字符串进行切割
type Split<
S extends string,
Delimiter extends string,
> = S extends `${infer A}${Delimiter}${infer B}` ? [A, ...Split<B, Delimiter>] : [S]
// 用例
type Item = 'semlinker,lolo,kakuqo';
type ElementType = Split<Item, ','>; // ["semlinker", "lolo", "kakuqo"]
联合类型变交叉类型
type UnionToIntersection<U> = (U extends any? (arg: U) => void : never) extends (arg: infer I) => void ? I : never
这里涉及到 协变、逆变等概念
怎么知道对象类中的可选属性
type Test = {
name?: string,
age: number
}
可选属性,其实就是name可以是string类型,也可以是undefined类型。
type OptionalKeys<T> = {
[K in keyof T as undefined extends T[K] ? K : never]: T[K]
}
去掉 readonly,去掉 可选
直接 - readonly xxx
, xxx-?
获取数组类型的个数
A是数组类型:A extends any[]
A的长度就是A['length']