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

如何定义无需数组参数的TypeScript对象泛型?

如何改写TypeScript泛型,使其支持直接传入多个字符串字面量参数

当然可以,你只需要利用TypeScript 4.0及以上版本支持的可变泛型参数(剩余参数语法),改写后的泛型可以直接接受多个字符串字面量作为参数,无需包裹成数组类型。

改写后的泛型定义

// 支持1个或多个字符串字面量参数
type Params<T extends string, ...Rest extends string[]> = Record<T | Rest[number], string>;

如果需要支持0个参数(生成空对象类型),可以给第一个参数设置默认值:

// 支持0个或多个字符串字面量参数
type Params<T extends string = never, ...Rest extends string[]> = Record<T | Rest[number], string>;

使用示例

// 单个参数场景
const singleParam: Params<'param1'> = { param1: 'hello' };

// 多个参数场景
const multiParams: Params<'param1', 'param2', 'param3'> = {
  param1: 'value1',
  param2: 'value2',
  param3: 'value3'
};

// 0个参数场景(仅当泛型有默认值时可用)
const emptyParams: Params<> = {};

原理说明

原来的泛型通过Record<T[number], string>提取数组类型T的元素联合类型;改写后的泛型:

  • 用T extends string定义第一个必填的字符串参数
  • 用...Rest extends string[]接收后续任意数量的字符串参数
  • 通过T | Rest[number]将所有传入的字符串字面量合并成一个联合类型
  • 最后用Record生成以该联合类型为键、string为值的对象类型

内容的提问来源于stack exchange,提问作者Siraj Kakeh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:45:09