泛型

  1. type isSubTying<Child, Par> = Child extends Par ? true : false;
  2. type isXX2 = isSubTyping<1, number>; // true
  3. type isYY2 = isSubTyping<'string', string>; // true
  4. type isZZ2 = isSubTyping<true, boolean>; // true

条件类型

TypeScript 支持使用三元运算的条件类型,它可以根据 ?前面的条件判断返回不同的类型。同时,三元运算还支持嵌套。

  1. type isSubTyping<Child, Par> = Child extends Par ? true : false;
  2. type isAssertable<T, S> = T extends S ? true : S extends T ? true : false;
  3. type isNumAssertable = isAssertable<1, number>; // true
  4. type isStrAssertable = isAssertable<string, 'string'>; // true
  5. type isNotAssertable = isAssertable<1, boolean>; // false

分配条件类型

在条件类型中,如果入参是联合类型,则会被拆解为一个个独立的(原子)类型(成员),然后再进行类型运算。

  1. type BooleanOrString = boolean | string;
  2. type StringOrNumberArray<E> = E extends string | number ? E[] : E;
  3. type WhatIsThis = StringOrNumberArray<BooleanOrString>; // boolean | string[]

条件类型中的类型推断 infer

类型推断操作符 infer 来获取类型入参的组成部分。

  1. {
  2. type ElementTypeOfArray<T> = T extends (infer E)[] ? E : never;
  3. type isNumber = ElementTypeOfArray<number[]>; // number
  4. }
  5. {
  6. type ElementOfObj<T> = T extends { name: infer E; id: infer I } ? [E, I] : never;
  7. type isArray = ElementOfObj<{name: 'name', id: 1, age: 30}>; // ['name', 1]
  8. }

索引访问类型

索引访问类型是通过属性名、索引、索引签名按需提取对象任意成员类型。

  1. interface MixedObject {
  2. animal: {
  3. type: 'animal' | 'dog' | 'cat';
  4. age: number;
  5. }
  6. [name: number]: {
  7. type: string;
  8. age: numnber;
  9. nickname: string;
  10. }
  11. [name: string]: {
  12. type: string;
  13. age: number;
  14. }
  15. }
  16. type animal = MixedObject['animal'];
  17. type animalType = MixedObject['animal']['type'];
  18. type stringIndex = MixedObject[string];
  19. type stringIndex = MixedObject['string'];
  20. type numberIndex = MixedObject[number];
  21. type numberIndex0 = MixedObject[0];

keyof

可以使用 keyof 关键字提取对象属性名、索引名、索引签名的类型。

  1. type MixedObjectKeys = keyof MixedObject; // string | number;
  2. type animalKyes = keys animal; // 'type' | 'age';
  3. type numberIndexKeys = keyof numberIndex; // 'type' | 'age' | 'nickname';

typeof

在表达式上下文中使用 typeof,则是获取表达式的类型,如果在类型上下文中使用,则是用来获取变量或者属性的了类型。typeof 的主要用途是在类型上下文中获取变量或者属性的类型。

  1. {
  2. let StrA = 'a';
  3. const unions = typeof StrA; // unions 类型是 "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"
  4. const str: typeof StrA = 'string'; // strs 类型是 string
  5. type DerivedFromStrA = typeof StrA; // string
  6. }

映射类型

索引签名语法和 in 关键字限定对象属性的范围。

  1. type SpecifiedKeys = 'id' | 'name';
  2. type TargetType = {
  3. [key in SpecifiedKeys]: any;
  4. };

注意:我们只能在类型别名定义中使用 in,如果在接口中使用,则会提示一个 ts(1169) 的错误。 注意:in 和 keyof 也只能在类型别名定义中组合使用。

Equal

https://kaiwu.lagou.com/course/courseInfo.htm?courseId=885#/detail/pc?id=7447