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

为何TypeScript不允许部分指定泛型参数生成新泛型函数?

为什么TypeScript实例化表达式不支持部分指定泛型参数?

TypeScript的实例化表达式不允许部分指定泛型参数、保留剩余参数作为新泛型变量,这是当前语言设计的明确限制,核心原因如下:

1. 语言设计的一致性要求

TypeScript在泛型处理上一直遵循「要么全显式指定泛型参数,要么全由编译器自动推断」的规则。不管是早期的泛型函数调用,还是后来新增的实例化表达式,都延续了这个逻辑——避免因为部分传参带来的语法歧义,同时降低语言本身的复杂度。

如果要支持部分指定,需要引入全新的语法标记(比如专门的符号表示“该参数保留为泛型”),这会增加语言学习成本,也不符合TypeScript团队一直追求的“简洁性”设计目标。

2. 现有语法可覆盖类似需求

虽然实例化表达式不支持这种操作,但你可以通过其他方式实现完全相同的效果:

方案一:手动封装新泛型函数

最直观的方式是写一个新的泛型函数,固定你想要的参数类型,剩下的参数保留为泛型:

type TypeA = { a: string };

function mergeFunc<T_1, T_2>(a: T_1, b: T_2) {
    return { ...a, ...b };
}

// 固定第一个参数为TypeA,保留Tp作为新泛型参数
function newGenMergeFunc<Tp>(a: TypeA, b: Tp) {
    return mergeFunc(a, b);
}

方案二:用类型别名适配函数类型

通过定义一个带参数的泛型函数类型,把原函数适配成你想要的形式:

type TypeA = { a: string };

function mergeFunc<T_1, T_2>(a: T_1, b: T_2) {
    return { ...a, ...b };
}

// 定义一个固定T_1的泛型函数类型
type FixedFirstArgMerge<T> = <Tp>(a: T, b: Tp) => T & Tp;
// 将原函数赋值给这个类型
const newGenMergeFunc: FixedFirstArgMerge<TypeA> = mergeFunc;

这两种方案都能实现你期望的“固定部分泛型参数、保留剩余参数为泛型”的效果,而且完全符合TypeScript的现有语法规则。

内容的提问来源于stack exchange,提问作者LeoPkm2-1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:57:11