TypeScript如何让接口内的fn函数单独泛型化而非接口级泛型?
TypeScript复用泛型函数接口实现函数级泛型字段
问题背景
已定义泛型函数接口Method<T>,表示接收T类型参数并返回T类型值的函数。现在需要创建包含fn字段的接口,要求复用Method接口定义fn,且fn的泛型是函数级(即每次调用fn可独立指定泛型参数,而非整个接口固定一个泛型)。
原代码示例:
export interface Method<T> { (answer: T): T; } // 手动实现的函数级泛型fn interface Wrapper { fn: <T>(a: T ) => T } // 尝试复用Method但未正确实现函数级泛型的写法(不可用) interface MethodWrapper { fn: Method }
可行方案
完全可以实现,只需在fn字段的类型声明中直接添加泛型,复用Method<T>的定义,让fn本身成为泛型函数。
实现代码
export interface Method<T> { (answer: T): T; } // 正确复用Method并实现函数级泛型的写法 interface MethodWrapper { fn: <T> Method<T>; } // 使用示例 const wrapper: MethodWrapper = { fn: (val) => val }; const numResult = wrapper.fn(123); // numResult类型为number const strResult = wrapper.fn("test"); // strResult类型为string
原理说明
<T> Method<T>等价于直接声明<T>(answer: T) => T,但复用了Method接口的定义,避免重复编写函数签名。- 这种写法让
fn成为函数级泛型:每次调用fn时,TypeScript会根据传入的参数自动推断T的类型,无需在MethodWrapper接口层面指定泛型。
常见误区解析
之前的fn: Method写法不可用,因为未指定泛型参数的Method会被TypeScript推断为Method<unknown>,导致fn只能接收unknown类型参数,返回值也为unknown,无法实现函数级泛型的灵活调用。
内容的提问来源于stack exchange,提问作者Neo
相关产品推荐
相关产品推荐

