泛型
type isSubTying<Child, Par> = Child extends Par ? true : false;type isXX2 = isSubTyping<1, number>; // truetype isYY2 = isSubTyping<'string', string>; // truetype 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>; // truetype isStrAssertable = isAssertable<string, 'string'>; // truetype 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 类型是 stringtype 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
