如何基于TypeScript自定义联合类型构建对应值的数组?
基于TypeScript联合类型生成对应数组(保持单一数据源)
要实现单一数据源、避免重复维护类型和数组内容,最稳妥的方式是反过来操作:先定义运行时的数组,再从数组推导TypeScript类型——因为TypeScript类型仅存在于编译阶段,无法直接转化为运行时的值。
最优实现方案
- 定义带有
as const的字面量数组,让TypeScript推断出精确的元素类型:
export const fruits = ["apple", "banana", "grape"] as const;
- 从数组推导联合类型:
export type Fruit = typeof fruits[number];
这样Fruit类型会自动被推断为"apple" | "banana" | "grape",后续只要修改fruits数组的元素,Fruit类型会同步更新,彻底实现单一数据源,无需手动维护类型与数组的一致性。
若必须先定义类型的妥协方案
如果因场景限制必须先定义Fruit类型,可通过类型守卫验证数组元素合法性,但这种方式仍需手动同步数组内容(无法完全避免重复):
export type Fruit = "apple" | "banana" | "grape"; // 类型守卫:验证值是否属于Fruit类型 function isFruit(value: string): value is Fruit { return ["apple", "banana", "grape"].includes(value); } // 生成符合类型要求的数组 const fruits = ["apple", "banana", "grape"].filter(isFruit);
这种方式能确保数组元素符合Fruit类型,但数组内容仍需和类型手动同步,不如第一种方案优雅。
内容的提问来源于stack exchange,提问作者Christof Buechi
相关产品推荐
相关产品推荐

