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

如何基于TypeScript联合类型生成仅含单个对应键的对象联合类型

实现目标联合类型的解决方案

没问题!你可以借助TypeScript的分布式条件类型特性来搞定这个需求,不用手动逐个编写联合成员。下面给你两种实用的实现方式:

方法一:映射类型 + 索引访问

这种写法利用映射类型先生成“键对应单键对象”的结构,再通过索引访问提取出所有值类型组成联合:

type BooleanOperator = "and" | "or";

type ConditionMap_Good = {
  [K in BooleanOperator]: { [Key in K]: string[] }
}[BooleanOperator];

// 最终生成的类型正是你想要的:
// type ConditionMap_Good = { and: string[] } | { or: string[] }

方法二:分布式条件类型封装

如果想让逻辑更清晰,可以封装一个通用的工具类型,专门生成“单键对象”的联合:

type BooleanOperator = "and" | "or";

// 通用工具类型:传入键联合和值类型,生成单键对象的联合
type SingleKeyUnion<K extends string, V> = K extends any ? { [Key in K]: V } : never;

// 生成目标类型
type ConditionMap_Good = SingleKeyUnion<BooleanOperator, string[]>;

为什么这能生效?

核心在于分布式条件类型的特性:当条件类型的左侧是一个联合类型时,TypeScript会自动把联合拆成单个成员,分别计算类型后再合并成新的联合。

比如在第二种方法里,K extends any会触发分布式特性,让BooleanOperator的每个成员("and"、"or")单独生成对应的单键对象,最后组合成你需要的联合类型。

而你之前用的{ [K in BooleanOperator]: string[] }是普通的映射类型,它会生成一个包含所有键的单一对象,和我们要的“多个单键对象的联合”完全不同。

内容的提问来源于stack exchange,提问作者Ionuț-Claudiu Herciu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:47:28