我正在尝试检查变量是否属于某种类型。
代码:
type GeneralType = SubTypeA | SubTypeB;
type SubTypeA = 'type1' | 'type2';
type SubTypeB = 'type3' | 'type4';
function someFunction(arg1: GeneralType) {
if (arg1 instanceof SubTypeA) {
// Do something
}
// Continue function
return arg1;
}
当然,此代码在第6行失败,因为instanceof
对类型不可用。我是否可以使用另一种选项,而无需显式检查SubTypeA
的每个可能值?
答案 0 :(得分:0)
正如评论中提到的,似乎没有实现这一目标的方法。
最后,我发现最优雅的方法是使用Type Guards,如下所示:
type GeneralType = SubTypeA | SubTypeB;
type SubTypeA = 'type1' | 'type2';
type SubTypeB = 'type3' | 'type4';
function someFunction(arg1: GeneralType) {
if (isSubTypeA(arg1)) {
// Do something
}
// Continue function
}
function isSubTypeA(arg: GeneralType): arg is SubTypeA {
return ['type1', 'type2'].some(element => element === arg);
}
答案 1 :(得分:0)
类型防护通常用于区分联合。还有更多方法可以完成:
switch
语句。 switch
语句
这种方法很简单,但是如果您的工会规模很大,可能会变得很麻烦。
function someFunction(arg1: GeneralType) {
switch(arg1) {
case 'type1':
case 'type2':
return /* */
default:
/* ... */
}
}
someFunction('type1');
枚举
这里的缺点是它不适用于字符串枚举,仅适用于常规枚举。
enum SubTypeA {
type1,
type2,
}
enum SubTypeB {
type3,
type4,
}
type GeneralType = SubTypeA | SubTypeB;
function someFunction(arg1: GeneralType) {
if (arg1 in SubTypeA) {
/* ... */
}
}
someFunction(SubTypeA.Type1);
如您所见,编写类型保护程序需要先进行更多的工作,但是类型保护程序没有其他方法的限制。除此之外,它们只是功能,因此可以重用。您是一个不错的选择。