我定义了以下类型:
type Admin: 'ADMIN' | 'AGENT';
我有一个从本地存储返回用户角色的函数:
return localStorage.getItem('role');
我想测试返回的项目是否是上述字符串文字之一。
您应该创建一个类型保护:
function isAdmin(arg: string): arg is Admin {
return arg === 'ADMIN' || arg === 'AGENT';
}
然后在你的代码中:
let role: string = localStorage.getItem('role');
if (isAdmin(role)) {
... here role has the type Admin ...
}
类型保护是函数的一种特殊形式,其中返回对其参数的类型进行断言。然后编译器知道当函数返回时
true
参数具有指定的类型。
不幸的是,如果不重复字符串并至少编写一次显式测试,就无法做到这一点,但至少您可以编写一次代码并使用它来扩展类型检查以安全地覆盖该值。
类型在编译期间被删除,因此您无法使用它们进行比较。您可以使用基于字符串的枚举:
enum Role {
"ADMIN",
"AGENT"
}
let role = localStorage.getItem("role");
if (role && role in Role) {
console.log("role exists");
};
还有另一个选项是类型保护的变体 - 它不需要重复字符串,但需要更改定义类型的方式。
您可以定义一个有效值数组,然后根据该数组定义类型,而不是将类型定义为
type Admin: 'ADMIN' | 'AGENT';
。这允许编写引用有效值数组的类型保护函数,以验证字符串是否是正确的类型。
const AdminRoles = ['ADMIN', 'AGENT'] as const;
type Admin = (typeof AdminRoles)[number];
function isAdmin(val: string): val is Admin {
return AdminRoles.includes(val as Admin);
}