每当我在TypeScript中具有联合类型的字符串时,我需要做的很常见的事情就是获取这些字符串文字的数组。
export type UserPersona =
| "entrepreneur"
| "programmer"
| "designer"
| "product_manager"
| "marketing_sales"
| "customer_support"
| "operations_hr"
我觉得它有点麻烦,但是每当需要执行此操作时,我都会创建一个对象映射,再次键入所有内容,然后获取可以转换类型的键。
const userPersonaMap: { [key in UserPersona]: true } = {
entrepreneur: true,
programmer: true,
designer: true,
product_manager: true,
marketing_sales: true,
customer_support: true,
operations_hr: true,
}
export const userPersonas = Object.keys(userPersonaMap) as Array<UserPersona>
我不喜欢这种方法的一些事情:
答案 0 :(得分:0)
这不能直接回答问题,但是可以提供不同的解决方案来获得相同的结果。
/**
* Creates a string enum. Use like so:
* const Ab = strEnum(['a', 'b']);
* type AbKeys = keyof typeof Ab;
* @param keys keys in the enum
* @returns enum object
*/
export function createStringEnum<T extends string>(keys: T[]): {[K in T]: K} {
return keys.reduce((res, key) => {
res[key] = key;
return res;
}, Object.create(null));
}
const Ab = createStringEnum(['a', 'b']);
console.log(Object.keys(Ab)); // ['a','b']
console.log(Ab.a) // 'a'
type AbKeys = keyof typeof Ab;
const a: AbKeys = 'c'; // error