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

TypeScript如何兼顾对象类型检查并生成指定键联合类型?

TypeScript 同时实现对象类型校验与自动生成键联合类型

要解决既保证animals对象的类型校验,又能自动生成具体键的联合类型作为AnimalId的问题,有两种实用方案:

方案一:泛型函数约束(兼容低版本TS)

先定义基础的Animal类型,再通过泛型函数约束对象结构,同时保留键的字面量类型:

// 定义Animal基础类型
type Animal = {
  name: string;
  age: number;
};

// 泛型函数:约束输入对象的每个值符合Animal类型,同时返回原类型以保留键的字面量
function createAnimals<T extends Record<string, Animal>>(animals: T): T {
  return animals;
}

// 创建符合类型约束的animals对象
const animals = createAnimals({
  bear: { name: "Bear", age: 5 },
  lion: { name: "Lion", age: 7 }
});

// 自动生成具体键的联合类型
type AnimalId = keyof typeof animals; // 类型为 "bear" | "lion"

如果animals里的属性不符合Animal类型(比如把age写成字符串),TypeScript会直接报错,同时AnimalId能准确获取对象的键集合。

方案二:使用satisfies操作符(TS 4.9+)

利用TypeScript 4.9新增的satisfies操作符,结合const断言保留字面量类型,写法更简洁:

type Animal = {
  name: string;
  age: number;
};

// 使用satisfies约束类型,as const保留键的字面量窄类型
const animals = {
  bear: { name: "Bear", age: 5 },
  lion: { name: "Lion", age: 7 }
} as const satisfies Record<string, Animal>;

type AnimalId = keyof typeof animals; // 类型为 "bear" | "lion"

这种写法无需额外函数,同样能在animals类型不符合时给出报错,同时自动生成准确的AnimalId联合类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:10:20