如何为接口方法指定泛型参数并获取其特定版本?
TypeScript泛型接口方法的返回类型获取问题
先看这个基础示例:
type Foo<T> = (x: T) => T[] type X = ReturnType<Foo<number>>
正如预期,X的类型是number[]。
但当把泛型函数作为接口的成员时,问题就来了:
interface Bar { foo<T>(x: T): T[] } type BarFoo = Bar['foo'] type Y = ReturnType<BarFoo<number>> // 报错:BarFoo is not generic type Z = ReturnType<Bar['foo']<number>> // 语法错误:'>' expected
直接通过索引访问得到的BarFoo不是泛型类型,没法直接传入类型参数;而直接在ReturnType里给Bar['foo']传参数又会触发语法错误。
另外,下面这种写法也得不到预期结果,它会返回unknown[]:
type Ret = BarFoo extends (x: number) => infer T ? T : never
解决方法
要获取泛型接口方法的特定版本,有几种可行的方式:
方式1:用条件类型绑定类型参数
定义一个泛型类型,通过条件类型匹配接口方法的签名,推断对应类型参数下的返回值:
interface Bar { foo<T>(x: T): T[] } type BarFoo<T> = Bar['foo'] extends (x: T) => infer R ? R : never type Y = BarFoo<number> // number[]
方式2:结合Parameters和上下文推断
先提取接口方法的类型,再构造指定参数类型的函数签名,让编译器自动推断返回类型:
interface Bar { foo<T>(x: T): T[] } type BarFoo = Bar['foo'] type SpecificFoo = (x: number) => ReturnType<BarFoo> type Y = ReturnType<SpecificFoo> // number[]
方式3:直接断言为具体函数类型
手动写出目标版本的函数类型,将接口方法断言为该类型后再取返回值:
interface Bar { foo<T>(x: T): T[] } type SpecificFoo = (x: number) => number[] const fooInstance: SpecificFoo = {} as Bar['foo'] type Y = ReturnType<typeof fooInstance> // number[]
内容的提问来源于stack exchange,提问作者riv
相关产品推荐
相关产品推荐

