You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用泛型类型描述泛型匿名函数?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,之后再将该类型别名用于变量注解。

实现步骤

  1. 定义泛型函数类型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>;
  1. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:02:01