07-TypeScirpt-映射类型-分布式条件类型

2020-10-04  本文已影响0人  低头看云

映射类型

interface TestInterface1 {
    name: string
    age: number
  }
  interface TestInterface2 {
    readonly name: string
    readonly age: number
  }

  // type Readonly<T> = {
  //   readonly [P in keyof T]: T[P]
  // }
  // type Partial<T> = {
  //   [P in keyof T]?: T[P]
  // }
  // 像下面这样使用:

  type PersonPartial = Partial<TestInterface1>
  type ReadonlyPerson = Readonly<TestInterface1>
  // 可读  可选参数
  type MyType1 = Partial<Readonly<TestInterface1>>
 interface TestInterface {
    name: string
    age: number
  }

  //type MyType2 = {
  // name: string;
  // }
  type MyType2 = Pick<TestInterface, 'name'>

  type Animal = 'person' | 'dog' | 'cat'
  interface PropInterface {
    name: string
    age: number
  }
  type MyType3 = Record<Animal, PersonPartial>

  let pp: MyType3 = {
    person: {
      name: 'zs',
      age: 18,
    },
    dog: {
      name: 'wc',
      age: 3,
    },
    cat: {
      name: 'mm',
      age: 2,
    },
  }

条件类型(三目运算)

  type MyType<T> = T extends string ? string : any
  type res = MyType<boolean>

分布式条件类型

  type MyType1<T> = T extends any ? T : never
  type MyType2 = MyType1<string | number | boolean | null | undefined>

  type MyType3 = Extract<MyType2, string>
  type MyType4 = Exclude<MyType2, string>
  type MyType5 = NonNullable<MyType2>
  type MyType6 = ReturnType<() => number> // number
  class Person {
    constructor(public name: string, public age: number) {}
  }

  type MyType7 = ConstructorParameters<typeof Person>
  function say(name: string, age: number, str: string) {}

  type MyType8 = Parameters<typeof say>

  // Parameters
  type Parameters<T extends (...args: any) => any> = T extends (
    ...args: infer P
  ) => any
    ? P
    : never

infer 关键字

  type MyType11<T> = T extends Array<infer U> ? U : T

  type MyType12 = MyType<number>
  type MyType13 = MyType<number[]>
  type MyType14 = MyType<string[]>
  type ParamType<T> = T extends (param: infer P) => any ? P : T
  // 这个条件语句 T extends (param: infer P) => any ? P : T 中,infer P 表示待推断的函数参数。
  // 整句表示为:如果 T 能赋值给 (param: infer P) => any,则结果是 (param: infer P) => any 类型中的参数 P,否则返回为 T。

  interface User {
    name: string
    age: number
  }

  type Func = (user: User) => void

  type Param = ParamType<Func> // Param = User
  type AA = ParamType<string> // string
  
上一篇下一篇

猜你喜欢

热点阅读