如何在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]
原理说明
- 外层的映射类型
{ [K in keyof AllKeys]: ... }会遍历AllKeys的每个键,为每个键K生成一个仅包含该键的对象类型。比如遍历到prop1时,生成的类型是{ prop1: number },以此类推得到三个单键类型。 - 最后通过
[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
相关产品推荐
相关产品推荐

