Appearance
类型推论
赋值时会推论
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