如何定义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
相关产品推荐
相关产品推荐

