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

TypeScript如何按条件向联合类型中添加多个指定值?

问题根因

  1. TypeScript 类型体系仅在编译期生效,你定义的运行时普通变量无法直接参与类型运算,需要先将变量标记为编译期可识别的字面量类型。
  2. 原有条件类型的语法不符合TS规范,正确的条件类型格式为类型A extends 类型B ? 命中返回类型 : 未命中返回类型,不能直接在extends后拼接运行时判断表达式。

正确实现方案

方案1:基于本地常量判断

首先给环境常量增加as const断言,将其类型固定为字面量类型而非通用string类型,再按条件类型语法拼接:

// as const 强制将environment的类型推导为字面量'production',而非宽泛的string类型
const environment = 'production' as const;

type LiveSupportedSourceLanguages =
  | LanguageISOCode.En
  | LanguageISOCode.Es
  | LanguageISOCode.Pt
  | LanguageISOCode.De;

type DevSupportedSourceLanguages =
  | LanguageISOCode.Ko
  | LanguageISOCode.It;

// 按环境条件拼接最终类型
export type SupportedSourceLanguages = typeof environment extends 'production'
  ? LiveSupportedSourceLanguages
  : LiveSupportedSourceLanguages | DevSupportedSourceLanguages;

当environment为production时,SupportedSourceLanguages仅包含4个生产环境可用语言;为其他值时自动追加韩语、意大利语两个开发环境语言。

方案2:基于构建工具注入的环境变量判断

如果你用Webpack、Vite等构建工具的环境变量注入能力(比如Vite的import.meta.env、Webpack的DefinePlugin),可以先给环境变量补充全局类型定义(以Vite为例,在项目根目录的env.d.ts中添加):

/// <reference types="vite/client" />
interface ImportMetaEnv {
  readonly VITE_NODE_ENV: 'production' | 'development' | 'staging'
}
interface ImportMeta {
  readonly env: ImportMetaEnv
}

随后直接使用环境变量的类型做判断即可:

export type SupportedSourceLanguages = ImportMetaEnv['VITE_NODE_ENV'] extends 'production'
  ? LiveSupportedSourceLanguages
  : LiveSupportedSourceLanguages | DevSupportedSourceLanguages;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:06:00