如何从TypeScript联合类型中获取一组字符串文字?

时间:2019-03-13 17:49:32

标签: typescript

每当我在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>

我不喜欢这种方法的一些事情:

  1. 我必须两次键入所有内容。
  2. 我必须转换类型。
  3. 存在运行时开销,这是微不足道的,但我一直都这样做

1 个答案:

答案 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