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

TypeScript中如何根据对象数组key值动态约束关联对象类型

TypeScript 动态根据Column配置推导Row类型实现方法

核心思路是通过泛型捕获传入columns配置中key字段的字面量类型,再通过映射类型生成对应的Row结构,不需要额外手动声明类型,TS会自动做类型校验。

完整实现代码

// 定义支持泛型的Column类型,K为key字段的字面量联合类型
type Column<K extends string = string> = {
  key: K;
  title: string;
};

const table = <K extends string>(
  columns: readonly Column<K>[],
  rows: Record<K, string>[]
) => {
  // 函数内部逻辑
};

效果验证

按照上述定义后,你给出的示例会自动获得类型约束:

table(
  [
    { key: "firstName", title: "First Name" },
    { key: "address", title: "Address" },
  ],
  // ✅ 类型校验通过,包含所有对应key的属性
  [{ firstName: "mKman", address: "1 First St" }]
);

table(
  [
    { key: "firstName", title: "First Name" },
    { key: "address", title: "Address" },
  ],
  // ❌ 类型校验报错:缺少address属性
  [{ firstName: "mKman" }]
);

关键说明

  • 参数columns加readonly修饰的作用:让TS可以直接从传入的数组字面量中推导具体的key字面量类型,不需要使用者手动给columns数组加as const断言,避免key类型被宽泛推导为string。
  • Record<K, string>是TS内置的工具类型,作用是生成键为联合类型K、值为string的对象类型,也就是你需要的Row结构。如果字段值不都是string,可以根据实际业务调整值类型,比如支持任意值写Record<K, unknown>,支持数字和字符串写Record<K, string | number>。
  • 如果需要字段可选,可以改成Partial<Record<K, string>>[]作为rows的类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:03:52