TypeScript中如何为特定对象键指定专属类型
解决TypeScript宠物对象的类型约束问题
你写法里的["dog" in Pet]是错误语法,TypeScript不支持这种写法。要实现你要的约束,得用映射类型+类型映射表来完成,以下是正确的实现方案:
正确代码示例
type Pet = 'dog' | 'cat' type DogName = 'Jack' | 'Fenton' type CatName = 'Priscilla' | 'Kittykat' // 先建立宠物类型到对应名字类型的映射表 type PetNameMap = { dog: DogName; cat: CatName; } // 生成符合要求的Pets类型 type Pets = { [K in Pet]: { [Name in PetNameMap[K]]: boolean } } // 正确使用(注意你原代码里的KittyKat是大小写错误,要和定义的Kittykat一致) const pets: Pets = { dog: { Jack: true }, cat: { Kittykat: true } }
逻辑说明
[K in Pet]会遍历Pet联合类型的所有成员(dog和cat),确保对象只能有这两个键,无法新增Pet之外的宠物类别。PetNameMap[K]会根据当前键K自动匹配对应的名字类型:K为dog时取DogName,K为cat时取CatName。- 内层的
{ [Name in PetNameMap[K]]: boolean }保证每个宠物的子对象只能使用对应允许的名字作为键,值限定为布尔类型。
内容的提问来源于stack exchange,提问作者Jacobdo
相关产品推荐
相关产品推荐

