检查变量是否属于Typescript中的自定义类型
Check if variable belongs to custom type in Typescript
我正在尝试检查一个变量是否属于某种类型。
代码:
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
?
的每个可能值
如评论中所述,似乎没有简单的方法可以实现这一点。
最后,我发现最优雅的方法是使用 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);
}
可以找到更详细的解释。
类型保护通常用于区分联合。还有更多方法可以做到这一点:
- 使用
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);
如您所见,编写类型保护需要更多的前期工作,但类型保护没有其他方法所具有的限制。除此之外,它们只是函数,所以它们可以被重用。你选对了。
我正在尝试检查一个变量是否属于某种类型。
代码:
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
?
如评论中所述,似乎没有简单的方法可以实现这一点。
最后,我发现最优雅的方法是使用 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);
}
可以找到更详细的解释
类型保护通常用于区分联合。还有更多方法可以做到这一点:
- 使用
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);
如您所见,编写类型保护需要更多的前期工作,但类型保护没有其他方法所具有的限制。除此之外,它们只是函数,所以它们可以被重用。你选对了。