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

如何在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 }; // ❌ 不合法,类型报错

原理说明

  1. 首先通过映射类型{ [K in Union]: { [key in K]: number } }生成一个中间对象,它的键是Union的每个成员,对应的值是仅包含该键的对象类型(比如K='a'时,值是{ a: number })。
  2. 然后通过[Union]索引访问这个中间对象,把所有值类型提取出来组成联合类型{ a: number } | { b: number },这样就限制了对象只能存在其中一个键。

简单直接的写法(适合键数量少的场景)

如果只有'a'和'b'两个键,也可以直接写联合类型,效果完全一样:

type ObjectType = { a: number } | { b: number };

为什么你原来的写法不行?

你写的{ [Union]: number }本质是索引签名,它表示对象可以包含Union中的所有键(允许同时存在a和b),而不是只能包含其中一个,所以不符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:45:50