如何定义TypeScript类型:仅order字段为字符串其余为数字?
TypeScript 特定字段类型定义问题解决方法
错误原因
你原来的写法里,ExcludeOrder<{ [key: string]: number }> 实际上还是一个索引签名类型 { [key: string]: number }。因为 keyof { [key: string]: number } 是 string 类型,Exclude<string, 'order'> 的结果依然是 string(string 是包含所有字符串字面量的无限集合,排除单个字面量后还是 string)。这就导致交叉类型时,order 字段同时被要求是 number(来自索引签名)和 string(来自单独定义的字段),类型冲突,所以报错。
解决方案
直接通过映射类型结合条件判断,一次性定义所有字段的类型:
type SpecificRecord = { [K in string]: K extends 'order' ? string : number; }; // 合法示例 const record: SpecificRecord = { order: 'first', amount: 100, price: 200, quantity: 300, }; // 非法示例(会触发类型检查报错) const invalidRecord: SpecificRecord = { order: 123, // 错误:'order' 必须是 string 类型 amount: '100' // 错误:'amount' 必须是 number 类型 };
如果需要拆分逻辑,也可以用映射类型先定义数字字段,再合并 order 字段:
type NumericFields = { [K in string as Exclude<K, 'order'>]: number }; type SpecificRecord = NumericFields & { order: string };
这种写法和第一种效果一致,本质都是通过映射类型排除 order 后定义数字索引,再合并 order 的字符串类型。
内容的提问来源于stack exchange,提问作者makmav
相关产品推荐
相关产品推荐

