如何将字符串常量数组转换为TypeScript联合类型?
问题解决方法
你的问题核心在于TypeScript对数组的默认类型推断:const myArrayOfConstants=[A,B,C]会被自动推断为string[],丢失了每个元素的具体字面量值信息,导致ConvertArrayToUnion<T>只能返回string而非目标联合类型。
解决方案1:使用as const断言保留字面量类型
修改数组的定义,添加as const断言,让TypeScript将数组推断为只读字面量元组,保留每个元素的具体值类型:
const A = "Hello" const B = "Bye" const C = "Foo" const myArrayOfConstants = [A, B, C] as const;
此时myArrayOfConstants的类型是readonly ["Hello", "Bye", "Foo"],你的原有类型工具就能正常工作:
type ConvertArrayToUnion<T extends readonly string[]> = T[number]; type Result = ConvertArrayToUnion<typeof myArrayOfConstants>; // "Hello" | "Bye" | "Foo"
解决方案2:显式指定数组的字面量元组类型
如果不想使用as const,也可以手动给数组指定包含具体字面量的只读元组类型:
const myArrayOfConstants: readonly ["Hello", "Bye", "Foo"] = [A, B, C];
同样能让ConvertArrayToUnion提取出目标联合类型,但这种方式需要手动维护字面量列表,灵活性不如as const。
内容的提问来源于stack exchange,提问作者pepinillo6969
相关产品推荐
相关产品推荐

