Typescript 缩小catch中的错误类型

Typescript 缩小catch中的错误类型,typescript,typescript2.0,Typescript,Typescript2.0,对于这段代码 try { throw new CustomError(); } catch (err) { console.log(err.aPropThatDoesNotExistInCustomError); } err是any,不会触发类型错误。如何将其缩小到预期的错误类型?您需要自己执行检查以缩小捕捉块内的范围。编译器不知道或不相信err肯定是CustomError: try { throw new CustomError(); } catch (err) { cons

对于这段代码

try {
  throw new CustomError();
}
catch (err) {
  console.log(err.aPropThatDoesNotExistInCustomError);
}

err
any
,不会触发类型错误。如何将其缩小到预期的错误类型?

您需要自己执行检查以缩小捕捉块内的范围。编译器不知道或不相信
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
  }
}
class CustomError extends Error {
  constructor() {
    super()
    throw new Error('Not so fast!');  // The evil part is here
  }
  aPropThatIndeedExistsInCustomError: string;
}
例如,下面是我对
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
  }
}
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
}
但是请记住,如果您对类型有错误,您可能会在运行时遇到麻烦

祝你好运


备注:更多信息,请参见TypeScript问题和

谢谢
instanceof
在这里不是问题,错误类型是明确的,而且它是
CustomError
类型,不一定是实例
const-err:CustomError=\u-err
看起来像一个非常丑陋的黑客。我已经检查了#8677和#9999,看起来它们是通过PR关闭的,但我不确定PR是如何解决问题的,我不明白你说的
instanceof
是什么意思。如果执行了
throw new CustomError()
操作,则已经创建(并抛出)了
CustomError
类的新实例。当且仅当
err
的构造函数是
CustomError
构造函数时,检查
err instanceof CustomError
将返回
true
。过去,您甚至不能使用
instanceof
或其他类型的保护来缩小范围(因此您必须将捕获的对象分配给一个新的缩小的变量),但是#9999修复了这一部分。在本例中,它肯定是。在任何其他情况下,它都可能是一个函数,它会在CustomError接口中抛出错误(这就是
err:CustomError
所暗示的)。谢谢你的通知,我注意到,
instanceof
在某种程度上开始以积极的方式影响类型,但不确定这种变化是从何而来。至于引入新变量的丑陋之处:不幸的是,强制编译器假设错误是您认为的类型,这是最直接的方法。不能对捕获对象的类型进行注释;您所能做的就是使用类型保护缩小它的范围,或者将它分配给一个新变量。如果有人能提出一个更清晰的答案,我会很感兴趣,但听到后会感到惊讶。通过阅读#8677和#9999,这是最好的。另请参见: