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

如何在TypeScript中仅为联合类型映射对象属性类型

TypeScript 联合类型判断与映射类型实现

实现IsUnion<T>类型

要判断一个类型是否为联合类型,可以利用TypeScript联合类型的分布式条件类型特性,通过对比拆分前后的类型结果来实现:

type IsUnion<T, U = T> = 
  T extends U 
    ? [U] extends [T] 
      ? false 
      : true 
    : false;

原理说明

  • 当T是联合类型时,T extends U会触发分布式特性,把T拆分为每个子类型单独判断。此时U是原始的联合类型,[U] extends [T]会因为T是单个子类型而返回false,最终整个表达式返回true。
  • 当T不是联合类型时,T和U完全相等,[U] extends [T]返回true,最终表达式返回false。

完善MappedType<T>类型

结合IsUnion修正原代码的分支逻辑(需求中要求非联合类型对应{ enum: never }而非never),最终实现如下:

type IsUnion<T, U = T> = 
  T extends U 
    ? [U] extends [T] 
      ? false 
      : true 
    : false;

type MappedType<T> = {
  [K in keyof T]: IsUnion<T[K]> extends true 
    ? { enum: T[K][] } // 等价于 Array<T[K]>
    : { enum: never };
};

测试示例

用你提供的OriginalType验证效果:

type OriginalType = {
    foo: "a" | "b";
    bar: "c";
    foobar: Record<string, string>;
};

type ResultType = MappedType<OriginalType>;
// ResultType 最终为:
// {
//   foo: { enum: ("a" | "b")[] },
//   bar: { enum: never },
//   foobar: { enum: never }
// }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:12:40