Skip to content

类型推论

赋值时会推论

ts
let myFavoriteNumber = 'seven'

函数默认进行推论,根据等号右边的类型推论到左边的类型。

ts
const sum = (a: number, b: number):number => {
  return a + b
}

返回值的推论

ts
const sum = (a: number, b: number) => {
  return a + b
}

属性推论

ts
// 不需要添加类型,除非想限制 value 的类型。
const foo = {
  bar: 'bar',
  baz: 'baz'
}

const { bar } = foo // 自动推导出 bar 是 string

interface Foo {
  bar: {
    baz: string
  }
}

type t = Foo['bar']['baz'] // 获取接口中的类型不能使用 .

类型反推

ts
const foo = {
  bar: 'bar'
}

type Foo = typeof foo

类型推导 infer

不执行函数查看函数的参数和返回值类型

ts
const foo = (x: string) => ({ bar: 'bar '})
// typeof foo 表示取出函数的类型
type MyReturnType = ReturnType<typeof foo>

// infer R 表示取出返回值的类型
// T extends (...args: any[]) => any 表示类型满足是函数
type ReturnType<T extends ((...args: any[]) => any)> = T extends ((...args: any[]) => infer R) ? R : any 

type MyParameters = Parameters<typeof foo>
type Parameters<T extends ((...args: any[]) => any)> = T extends ((...args: infer P) => any) ? P : never

取构造函数的参数和实例类型

ts
class Foo {
  constructor (name: string) {}
}

type My = ConstructorParameters<typeof Foo>
// T extends {new (...args: any[]): any} 表示满足能 new 的构造函数
type ConstructorParameters<T extends {new (...args: any[]): any}> = T extends {new (...args: infer C): any} ? C : any

type My = InstanceType<typeof Foo>
// T extends {new (...args: any[]): any} 表示满足能 new 的构造函数
type InstanceType<T extends {new (...args: any[]): any}> = T extends {new (...args: any[]): infer: R} ? R : any