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

如何在TypeScript中创建仅含单个指定键的OneOfKeys类型?

实现仅包含单个指定键的TypeScript类型

给定基础类型:

type AllKeys = {
  prop1: string
  prop2: string
  prop3: string
}

要创建OneOfKeys类型,要求对象只能包含AllKeys中的一个键,可以通过「映射类型+联合类型」的组合实现:

type OneOfKeys = {
  [K in keyof AllKeys]: {
    [P in K]: number
  }
}[keyof AllKeys]

原理说明

  1. 外层的映射类型{ [K in keyof AllKeys]: ... }会遍历AllKeys的每个键,为每个键K生成一个仅包含该键的对象类型。比如遍历到prop1时,生成的类型是{ prop1: number },以此类推得到三个单键类型。
  2. 最后通过[keyof AllKeys]索引访问这个映射结果,把三个单键类型合并成联合类型:{ prop1: number } | { prop2: number } | { prop3: number }。

验证效果

  • 合法场景:只包含单个指定键的对象会匹配联合中的对应成员,无报错:
const obj1: OneOfKeys = { prop1: 1 } // 合法
const obj2: OneOfKeys = { prop2: 2 } // 合法
  • 禁止场景:包含多个键或无关键的对象无法匹配任何联合成员,触发类型错误:
const obj3: OneOfKeys = { // 报错:不符合联合类型的任何成员
  prop1: 1,
  prop2: 2
}
const obj4: OneOfKeys = { // 报错:不存在randomProp属性
  randomProp: 1
}

为什么之前的写法不行?

你之前尝试的全必填映射类型要求必须包含所有键,而加?的可选映射类型虽然允许少传,但无法限制多传。而联合单键类型的方式,每个成员都严格只有一个键,自然就排除了多键或无关键的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:40:43