【发布时间】:2017-07-29 02:56:19
【问题描述】:
对于这段代码
try {
throw new CustomError();
}
catch (err) {
console.log(err.aPropThatDoesNotExistInCustomError);
}
err 是 any 并且不会触发类型错误。如何将其缩小到预期的错误类型?
【问题讨论】:
对于这段代码
try {
throw new CustomError();
}
catch (err) {
console.log(err.aPropThatDoesNotExistInCustomError);
}
err 是 any 并且不会触发类型错误。如何将其缩小到预期的错误类型?
【问题讨论】:
您需要自己执行检查以缩小 catch 块内的范围。编译器不知道也不相信err 肯定会是CustomError:
try {
throw new CustomError();
}
catch (err) {
console.log('bing');
if (err instanceof CustomError) {
console.log(err.aPropThatIndeedExistsInCustomError); //works
console.log(err.aPropThatDoesNotExistInCustomError); //error as expected
} else {
console.log(err); // this could still happen
}
}
例如,这是我对CustomError 的邪恶实现:
class CustomError extends Error {
constructor() {
super()
throw new Error('Not so fast!'); // The evil part is here
}
aPropThatIndeedExistsInCustomError: string;
}
在这种情况下,err不会是CustomError。我知道,这可能不会发生,但关键是编译器不会为您自动缩小范围。如果您完全确定类型,则可以分配给另一个变量:
try {
throw new CustomError();
}
catch (_err) {
const err: CustomError = _err;
console.log(err.aPropThatDoesNotExistInCustomError); // errors as desired
}
但请记住,如果您弄错类型,可能会在运行时遇到麻烦。
祝你好运!
【讨论】:
instanceof 在这里不是问题,错误类型是明确的,而且它是CustomError 类型,不一定是实例。 const err: CustomError = _err 看起来像一个非常丑陋的黑客。我查了#8677和#9999,貌似是通过PR关闭的,但是不知道PR是怎么解决问题的,
instanceof 是什么意思。如果您执行throw new CustomError(),则您已创建(并抛出)CustomError 类的新实例。当且仅当err 的构造函数是CustomError 构造函数时,检查err instanceof CustomError 将返回true。
instanceof 或其他类型保护来缩小范围(所以你几乎不得不将捕获的对象分配给一个新的缩小变量),但 #9999 修复了它的那一部分。
err: CustomError 所暗示的)。感谢您的通知,我注意到 instanceof 在某些时候开始以积极的方式影响类型,但不确定这种变化来自哪里。