TypeScript对象键不同但值类型一致时如何避免重复定义接口
解决方案
首先纠正bloodType的基础定义问题:字符串字面量联合类型不需要额外包裹一层{},正确定义如下:
type bloodType = "typeA" | "typeB" | "typeO";
根据你的需求,有两种常用方案可以跳过单独定义接口的步骤,直接约束对象所有值符合bloodType类型:
场景1:允许对象使用任意字符串作为键
可以直接用索引签名或者TypeScript内置的Record工具类型实现,两种写法效果完全等价:
索引签名写法
const population: { [key: string]: bloodType } = { "Bobby": "typeA", "Jimmy": "typeB", "Sandra": "typeB", "Angel": "typeO", "JimmyJohn": "typeA", };
Record语法糖写法
Record<键类型, 值类型>是TS内置的语法糖,写起来更简洁:
const population: Record<string, bloodType> = { "Bobby": "typeA", "Jimmy": "typeB", "Sandra": "typeB", "Angel": "typeO", "JimmyJohn": "typeA", };
以上两种写法都会自动校验所有值必须是bloodType允许的枚举值,写错会直接抛出类型错误。
场景2:键是固定的几个特定字符串
如果你需要和原来的IPopulation接口效果完全一致,也就是只能用指定的几个键、不能多也不能少,可以直接把键的联合类型传给Record的第一个参数,不需要单独定义接口:
const population: Record<"Bobby" | "Jimmy" | "Sandra" | "Angel" | "JimmyJohn", bloodType> = { "Bobby": "typeA", "Jimmy": "typeB", "Sandra": "typeB", "Angel": "typeO", "JimmyJohn": "typeA", };
这种写法会同时校验键的合法性和值的合法性,和单独定义接口的效果完全相同。
内容的提问来源于stack exchange,提问作者wongx
相关产品推荐
相关产品推荐

