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

如何定义TypeScript接口强制使用另一接口的属性值作为对象键名

实现方案

核心前提是需要先让TypeScript捕获到payloadKey中属性值的具体字符串字面量类型,默认情况下TS会把对象的字符串属性推断为宽泛的string类型,无法用来约束对象键。


步骤1:固定payloadKey的属性值类型

给payloadKey加as const断言,让TS能捕获到属性对应的具体字符串字面量:

// 加as const后,Activate的类型是'some_key',Multiple的类型是'some_other_key'
const payloadKey = {
  Activate: 'some_key',
  Multiple: 'some_other_key',
} as const;

// 如果你还需要原PayloadKeys接口,可以直接从常量推导
type PayloadKeys = typeof payloadKey;

步骤2:构造带动态键约束的请求类型

如果两个动态字段的类型相同,可以直接用Record配合交叉类型:

// 示例假设两个动态字段的值都是string类型
type MyRequest = Record<typeof payloadKey[keyof typeof payloadKey], string> & {
  otherNotDynamicStuff: string;
  // 其他固定字段在这里声明
};

如果两个动态字段的类型不同,分开声明映射即可:

type MyRequest = {
  // 定义Activate对应键的类型,这里示例为boolean
  [K in typeof payloadKey.Activate]: boolean;
} & {
  // 定义Multiple对应键的类型,这里示例为number数组
  [K in typeof payloadKey.Multiple]: number[];
} & {
  // 固定字段声明
  otherNotDynamicStuff: string;
};

使用效果

// 正确写法,TS不会报错
const myRequest: MyRequest = {
  [payloadKey.Activate]: true,
  [payloadKey.Multiple]: [1,2,3],
  otherNotDynamicStuff: 'something'
};

// 错误写法:漏写动态键、键名写错、值类型不对都会触发TS报错
const wrongRequest: MyRequest = {
  wrong_key: true, // 键名不匹配报错
  [payloadKey.Multiple]: '123', // 值类型不匹配报错
  otherNotDynamicStuff: 'something'
};

注意事项

如果payloadKey的属性值是运行时动态生成的,编译期无法确定具体字符串的话,TS无法实现这类约束,因为TS的类型检查仅在编译阶段生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:27:03