如何在TypeScript中定义仅含单个联合类型键的对象类型?
可以实现,具体方案如下
你想要的是只能包含'a'或'b'其中一个键的对象类型,直接用索引签名做不到(你原来的写法会允许同时存在两个键),需要通过联合类型+映射类型来实现:
可扩展的实现方式(适合键数量多的场景)
type Union = 'a' | 'b'; // 生成仅包含单个键的对象类型的联合 type ObjectType = { [K in Union]: { [key in K]: number } }[Union]; // 测试用例 const obj1: ObjectType = { a: 0 }; // ✅ 合法 const obj2: ObjectType = { b: 0 }; // ✅ 合法 const obj3: ObjectType = { a: 0, b: 1 }; // ❌ 不合法,类型报错
原理说明
- 首先通过映射类型
{ [K in Union]: { [key in K]: number } }生成一个中间对象,它的键是Union的每个成员,对应的值是仅包含该键的对象类型(比如K='a'时,值是{ a: number })。 - 然后通过
[Union]索引访问这个中间对象,把所有值类型提取出来组成联合类型{ a: number } | { b: number },这样就限制了对象只能存在其中一个键。
简单直接的写法(适合键数量少的场景)
如果只有'a'和'b'两个键,也可以直接写联合类型,效果完全一样:
type ObjectType = { a: number } | { b: number };
为什么你原来的写法不行?
你写的{ [Union]: number }本质是索引签名,它表示对象可以包含Union中的所有键(允许同时存在a和b),而不是只能包含其中一个,所以不符合需求。
内容的提问来源于stack exchange,提问作者Pytan
相关产品推荐
相关产品推荐

