将字符串文字解析为枚举数组

Parsing string literals into enum array

我在 API 回复中收到以下内容:

{ "roles": [ "ADMIN", "USER" ] }

其中响应将始终包含一组角色(USERPRESENTERORGANIZERADMIN)。

我想把它转换成有效的TypeScript数组(Role[]),其中类型Role定义如下:

export type Role = 'USER' | 'PRESENTER' | 'ORGANIZER' | 'ADMIN'

有什么想法吗?

如果我没猜错,那就是你想要做的。

enum RoleEnum {
  USER,
  PRESENTER,
  ORGANIZER,
  ADMIN
}

const parseEnum = (name: String): RoleEnum  => RoleEnum[`${name}`]

const parsed: RoleEnum[] = [ 'ADMIN', 'USER' ].map(parseEnum)

console.log(parsed)

可以将其转换为您的联合类型:

const apiRoleArray = ["ADMIN", "USER"];
const realRoleArray: Role[] = <Role[]>apiRoleArray;

但是 您可能想要验证其内容而不是仅仅信任 API。 :-) 借鉴 , you can create the type by using the keys of an object rather than defining it literally (see the 的原因):

const roleStrings = {
    USER: "",
    PRESENTER: "",
    ORGANIZER: "",
    ADMIN: ""
};

export type Role = keyof typeof roleStrings;

然后给自己一个验证函数:

const isRole = (s: string): s is Role => {
    return roleStrings.hasOwnProperty(s);
};

然后是强大的转换函数,例如:

const rawToRoleArray = (rawArray: string[]): Role[] => {
    return rawArray.map(s => {
        if (!isRole(s)) {
            throw new Error("Invalid Role: " + s);
        }
        return <Role>s;
    });
};

(如果你不需要它们,你可以将它们组合起来)

然后使用它:

// Valid
const realRoleArray: Role[] = rawToRoleArray(["ADMIN", "USER"]); 
console.log(realRoleArray);
// Invalid
const realRoleArray2: Role[] = rawToRoleArray(["ADMIN", "FOO"]); 
console.log(realRoleArray2);

Live in the playground | Live on jsFiddle

您的 Role 类型 不是 枚举。它只是一个限制特定值的字符串类型。

您可以将结果转换为 Role[],TypeScript 会很高兴。这假设传入数据永远不会有错误的值!

const data: {roles: Role[]} = JSON.parse('{"roles": ["ADMIN", "USER"]}');
data.roles // TypeScript knows it is a Role[]