泛型
type isSubTying<Child, Par> = Child extends Par ? true : false;
type isXX2 = isSubTyping<1, number>; // true
type isYY2 = isSubTyping<'string', string>; // true
type isZZ2 = isSubTyping<true, boolean>; // true
条件类型
TypeScript 支持使用三元运算的条件类型,它可以根据 ?前面的条件判断返回不同的类型。同时,三元运算还支持嵌套。
type isSubTyping<Child, Par> = Child extends Par ? true : false;
type isAssertable<T, S> = T extends S ? true : S extends T ? true : false;
type isNumAssertable = isAssertable<1, number>; // true
type isStrAssertable = isAssertable<string, 'string'>; // true
type isNotAssertable = isAssertable<1, boolean>; // false
分配条件类型
在条件类型中,如果入参是联合类型,则会被拆解为一个个独立的(原子)类型(成员),然后再进行类型运算。
type BooleanOrString = boolean | string;
type StringOrNumberArray<E> = E extends string | number ? E[] : E;
type WhatIsThis = StringOrNumberArray<BooleanOrString>; // boolean | string[]
条件类型中的类型推断 infer
类型推断操作符 infer 来获取类型入参的组成部分。
{
type ElementTypeOfArray<T> = T extends (infer E)[] ? E : never;
type isNumber = ElementTypeOfArray<number[]>; // number
}
{
type ElementOfObj<T> = T extends { name: infer E; id: infer I } ? [E, I] : never;
type isArray = ElementOfObj<{name: 'name', id: 1, age: 30}>; // ['name', 1]
}
索引访问类型
索引访问类型是通过属性名、索引、索引签名按需提取对象任意成员类型。
interface MixedObject {
animal: {
type: 'animal' | 'dog' | 'cat';
age: number;
}
[name: number]: {
type: string;
age: numnber;
nickname: string;
}
[name: string]: {
type: string;
age: number;
}
}
type animal = MixedObject['animal'];
type animalType = MixedObject['animal']['type'];
type stringIndex = MixedObject[string];
type stringIndex = MixedObject['string'];
type numberIndex = MixedObject[number];
type numberIndex0 = MixedObject[0];
keyof
可以使用 keyof 关键字提取对象属性名、索引名、索引签名的类型。
type MixedObjectKeys = keyof MixedObject; // string | number;
type animalKyes = keys animal; // 'type' | 'age';
type numberIndexKeys = keyof numberIndex; // 'type' | 'age' | 'nickname';
typeof
在表达式上下文中使用 typeof,则是获取表达式的类型,如果在类型上下文中使用,则是用来获取变量或者属性的了类型。typeof 的主要用途是在类型上下文中获取变量或者属性的类型。
{
let StrA = 'a';
const unions = typeof StrA; // unions 类型是 "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"
const str: typeof StrA = 'string'; // strs 类型是 string
type DerivedFromStrA = typeof StrA; // string
}
映射类型
索引签名语法和 in 关键字限定对象属性的范围。
type SpecifiedKeys = 'id' | 'name';
type TargetType = {
[key in SpecifiedKeys]: any;
};
注意:我们只能在类型别名定义中使用 in,如果在接口中使用,则会提示一个 ts(1169) 的错误。 注意:in 和 keyof 也只能在类型别名定义中组合使用。
Equal
https://kaiwu.lagou.com/course/courseInfo.htm?courseId=885#/detail/pc?id=7447