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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:09:03