TypeScript如何在接口属性层级单独使用泛型
问题描述
在TypeScript开发中,引用其他已定义的泛型类型时,如何在interface的单个属性层级传递、使用泛型,且无需将泛型参数声明在整个接口上?
问题复现代码如下:
type Fn<T> = (arg: T)=>void interface A { // 方法级泛型可正常声明 fn1<R>(arg: R): void, // 预期实现和fn1一致的属性级泛型效果,复用外部泛型类型Fn<S>,且不将泛型声明在整个接口上 // 下方写法为非法语法 fn2<S>: Fn<S> } interface B<S>{ // 不推荐的写法:泛型声明在整个接口上,仅单个属性使用该泛型 fn: Fn<S> }
原因说明
你写的fn2<S>: Fn<S>属于非法语法:
- 泛型参数写在成员名后(即
成员名<泛型>(参数):返回值)的写法,仅支持直接内联写完整的方法签名,不支持在该写法下直接引用外部独立的泛型类型别名。 - 如果泛型仅属于接口下的单个函数成员、不需要在实例化接口时就确定类型,泛型参数应该声明在对应函数的类型上,而非接口上或者属性名后。
实现方案
如果要复用已定义的Fn<T>类型,同时实现单属性级别的泛型效果,可以借助TS内置的Parameters和ReturnType工具类型提取原泛型类型的参数、返回值结构,写法如下:
type Fn<T> = (arg: T) => void interface A { fn1<R>(arg: R): void // 泛型声明在函数类型上,复用Fn的类型定义 fn2: <S>(...args: Parameters<Fn<S>>) => ReturnType<Fn<S>> }
该写法的效果和fn1完全一致:泛型S仅属于fn2属性对应的函数,不需要在接口层面声明泛型,调用fn2时TS会自动根据传入的参数推导S的类型:
const instance: A = { fn1: (arg) => {}, fn2: (arg) => {} } instance.fn1(123) // 泛型R自动推导为number instance.fn2("test") // 泛型S自动推导为string
如果你的Fn类型结构比较简单,也可以直接内联写函数类型的泛型,不需要借助工具类型:
interface A { fn1<R>(arg: R): void fn2: <S>(arg: S) => void }
内容的提问来源于stack exchange,提问作者TrevTheDev
相关产品推荐
相关产品推荐

