将字符串文字解析为枚举数组
Parsing string literals into enum array
我在 API 回复中收到以下内容:
{ "roles": [ "ADMIN", "USER" ] }
其中响应将始终包含一组角色(USER
、PRESENTER
、ORGANIZER
和 ADMIN
)。
我想把它转换成有效的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);
您的 Role
类型 不是 枚举。它只是一个限制特定值的字符串类型。
您可以将结果转换为 Role[]
,TypeScript 会很高兴。这假设传入数据永远不会有错误的值!
const data: {roles: Role[]} = JSON.parse('{"roles": ["ADMIN", "USER"]}');
data.roles // TypeScript knows it is a Role[]
我在 API 回复中收到以下内容:
{ "roles": [ "ADMIN", "USER" ] }
其中响应将始终包含一组角色(USER
、PRESENTER
、ORGANIZER
和 ADMIN
)。
我想把它转换成有效的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。 :-) 借鉴
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);
您的 Role
类型 不是 枚举。它只是一个限制特定值的字符串类型。
您可以将结果转换为 Role[]
,TypeScript 会很高兴。这假设传入数据永远不会有错误的值!
const data: {roles: Role[]} = JSON.parse('{"roles": ["ADMIN", "USER"]}');
data.roles // TypeScript knows it is a Role[]