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

如何创建描述数组字段所有值的联合类型以约束函数参数?

限制函数参数为数组元素指定字段的联合类型

你可以通过泛型+索引类型实现这个需求,核心思路是用泛型捕获数组元素的具体类型,再通过索引类型提取目标字段的所有可能值,形成联合类型。

针对你的示例实现

interface Item {
    name: string;
    value: number;
}

// 泛型T捕获数组元素类型,K约束为元素的键
const fn = <T extends Item, K extends keyof T>(arr: readonly T[], name: T[K]) => {
    // 这里写你的函数逻辑
};

// 测试:传入字面量数组时,TypeScript会自动推断name的类型为'a'|'b'
fn([{name: 'a', value: 1}, {name: 'b', value: 2}], 'a'); // 类型合法
fn([{name: 'a', value: 1}, {name: 'b', value: 2}], 'c'); // 类型报错,符合预期

// 如果是预先定义的数组变量,需要用as const保留字面量类型
const testArr = [{name: 'a', value: 1}, {name: 'b', value: 2}] as const;
fn(testArr, 'b'); // 合法
fn(testArr, 'd'); // 报错

代码解释

  • 泛型T:用于捕获数组元素的具体类型(包括字符串/数字字面量类型),这里加extends Item约束,确保元素符合你定义的接口结构。
  • 泛型K:约束为T的键(也就是name或value),用来指定要提取的目标字段。
  • 参数arr:定义为readonly T[],能让TypeScript更准确地推断元素的字面量类型(避免把name的类型自动拓宽为string)。
  • 参数name:类型设为T[K],即数组元素中K字段所有可能值的联合类型,完美实现你要的类型限制。

通用版本(不限定元素接口)

如果你的函数需要适配任意结构的数组,可以去掉T extends Item的约束:

const fn = <T extends Record<string, unknown>, K extends keyof T>(arr: readonly T[], name: T[K]) => {
    // 函数逻辑
};

// 适配其他结构的数组
fn([{id: 1, label: 'foo'}, {id: 2, label: 'bar'}], 'foo'); // 合法
fn([{id: 1, label: 'foo'}, {id: 2, label: 'bar'}], 'baz'); // 报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:50:36