如何用泛型类型描述泛型匿名函数?TypeX定义方案探讨
给定以下代码:
type SimpleFunction<I, O> = (input: I) => O; const mySimpleFunction: TypeX = <T, U>(arg: T) => U = { /* ... */ };
能否基于SimpleFunction来描述TypeX?
以下是几种失败的尝试:
尝试1
const mySimpleFunction1: SimpleFunction<T, U> = <T, U>(arg: T) => U = { /* ... */ };
错误 TS2304: Cannot find name 'T'.
问题 T和U不在其定义的词法作用域内(即匿名函数定义本身,也就是第一个等号之后的内容)。
尝试2
const mySimpleFunction2: <T, U>SimpleFunction<T, U> = <T, U>(arg: T) => U = { /* ... */ }; // 以及以下写法(两者问题相同): const mySimpleFunction3: <T, U> SimpleFunction<T, U> = <T, U>(arg: T) => U = { /* ... */ };
错误 TS1005: '(' expected.
问题 TypeScript编译器期望此处是函数定义参数列表的左括号,不支持直接在变量类型注解中这样简写泛型函数类型。
尝试3
const mySimpleFunction4: <T, U>(SimpleFunction<T, U>) = <T, U>(arg: T) => U = { /* ... */ };
错误 TS7051: Parameter has a name but no type. Did you mean 'arg0: SimpleFunction'?
问题 编译器将此格式识别为函数定义,要求参数必须有名称和类型。
尝试4
const <T, U>mySimpleFunction5: SimpleFunction<T, U> = <T, U>(arg: T) => U = { /* ... */ };
错误 TS1134: Variable declaration expected.
问题 变量名后的冒号前不允许添加泛型参数。
我知道可以省略类型让编译器自动推断,但这不是目标——我希望复用SimpleFunction这类基础类型来定义更复杂的泛型函数类型,以便编译器能在函数定义阶段捕获类型问题。
请问这个目标是否可行?如果可行,该如何实现?
注:本问题聚焦于泛型的特定子集——值泛型,而非泛型工作原理的基础问题。
可行。核心是先将TypeX定义为泛型函数类型别名,在定义时复用SimpleFunction,之后再将该类型别名用于变量注解。
实现步骤
- 定义泛型函数类型
TypeX,复用SimpleFunction:
type SimpleFunction<I, O> = (input: I) => O; // 将TypeX定义为泛型函数类型,本质等价于<T, U> SimpleFunction<T, U> type TypeX = <T, U>(input: T) => U; // 或者更直接复用SimpleFunction的写法: type TypeX = <T, U> SimpleFunction<T, U>;
- 使用
TypeX标注变量:
const mySimpleFunction: TypeX = <T, U>(arg: T) => { // 示例逻辑,需确保返回值符合U类型 return {} as U; };
原理说明
TypeScript允许将泛型函数类型定义为类型别名,此时泛型参数<T, U>属于整个函数类型的一部分,而非函数内部的局部泛型。这样定义后,TypeX就等价于一个接受任意输入类型T、返回任意输出类型U的泛型函数,完全基于SimpleFunction构建而来。
如果不想预先定义类型别名,也可以直接在变量注解中使用完整的泛型函数类型(本质和复用SimpleFunction等价):
const mySimpleFunction: <T, U>(input: T) => U = <T, U>(arg: T) => U = { /* ... */ };
内容的提问来源于stack exchange,提问作者Trevor Sears

