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

TypeScript如何校验字符串是否匹配字面量联合类型,无需手动枚举值数组?

TypeScript 字符串联合类型运行时校验实现方案

因为 TypeScript 的类型仅存在于编译期,运行时会被完全擦除,所以没法直接用联合类型做运行时校验。你可以通过以下几种方案避免硬编码重复的枚举值:

  • 方案1:从运行时常量数组推导联合类型(最推荐,只需维护一份枚举值)
    先定义字面量常量数组,再从数组自动生成联合类型,校验逻辑直接复用数组即可:
    // 仅需维护这一个数组,as const 确保类型收窄为字面量元组
    const UNION_VALUES = ['one', 'two', 'three'] as const;
    // 自动推导联合类型,无需手动重复写枚举值
    type UnionType = typeof UNION_VALUES[number];
    
    const myNumber: string = 'just a string';
    
    // 类型守卫校验函数
    function isUnionType(value: string): value is UnionType {
      return (UNION_VALUES as readonly string[]).includes(value);
    }
    
    // 使用示例
    if (isUnionType(myNumber)) {
      // 此处 myNumber 会被自动收窄为 UnionType 类型
    }
    
    后续新增枚举值只需修改UNION_VALUES数组,类型和校验逻辑会自动同步,不会出现不一致问题。
  • 方案2:基于枚举实现
    如果你需要更结构化的枚举管理,可以用TS枚举,枚举本身会保留运行时实体,直接取枚举值集合做校验:
    enum UnionEnum {
      One = 'one',
      Two = 'two',
      Three = 'three'
    }
    // 联合类型可以直接用 UnionEnum,也可以按需派生
    type UnionType = `${UnionEnum}`;
    
    function isUnionType(value: string): value is UnionEnum {
      return Object.values(UnionEnum).includes(value as UnionEnum);
    }
    
  • 方案3:适配第三方已有联合类型的场景
    如果联合类型是第三方定义的、你无法修改来源,可以给校验数组加类型约束,确保数组和联合类型完全对齐,少写/错写枚举值会直接触发编译报错:
    // 假设该类型为第三方导入的已有定义
    type UnionType = 'one' | 'two' | 'three';
    
    // 数组类型约束确保其包含所有UnionType的取值,不会漏写
    const UNION_VALUES: [UnionType, ...UnionType[]] = ['one', 'two', 'three'];
    
    function isUnionType(value: string): value is UnionType {
      return (UNION_VALUES as string[]).includes(value);
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:45:03