作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
TypeScript(在严格模式下)将以下函数的返回类型推断为 1 |未定义
:
enum E {A, B};
const f = (x: E) => {
if (x === E.A) {
return 1;
} else if (x === E.B) {
return 1;
}
}
如何确保将类型推断为数字(因为枚举已用尽)?目前我添加 ... else { throw undefined; }
,但这意味着如果我忘记实际用尽枚举中的所有选项,TypeScript 将无法捕获它。它适用于 switch 语句:
const g = (x: E) => {
switch (x) {
case E.A:
return 1;
case E.B:
return 1;
}
};
所以它不能与 if-else 一起使用似乎很奇怪,我觉得我遗漏了一些明显的东西。
最佳答案
根据评论中的讨论(感谢大家的投入),这是一个缺失的功能 (Github issue here)。目前唯一的解决方法是使用 ... else { ((x: never) => { throw undefined; })(x); }
,这很丑陋,但会确保类型被正确推断,并且如果枚举没有完全耗尽则会产生错误。
更新:实际上,我认为最好的方法是使用效用函数
export const assertNever = (arg: never): never => {
throw 'assertNever';
};
并像这样使用它:
if (value === ...) {
...
} else {
return assertNever(value);
}
或者(如果返回类型无关紧要)像这样:
if (value === ...) {
...
} else {
assertNever(value);
}
或者,在三元的情况下,像这样:
value === ...
? ...
: value === ...
? ...
: assertNever(value)
关于typescript - 在 TypeScript 的 if-else 语句中用尽枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48975236/
我想在订阅中捕获异常,但结果不符合预期。 this.userService.isUsernameValid (username) .pipe ( catchError
我是一名优秀的程序员,十分优秀!