TypeScript如何按条件向联合类型中添加多个指定值?
问题根因
- TypeScript 类型体系仅在编译期生效,你定义的运行时普通变量无法直接参与类型运算,需要先将变量标记为编译期可识别的字面量类型。
- 原有条件类型的语法不符合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
相关产品推荐
相关产品推荐

