try..catch 标识符的正确 jsdoc 类型注释是什么?

What is the correct jsdoc type annotation for a try..catch identifier?

用JSDoc注释注释JavaScript源时,如何注释try..catch标识符的类型?

try {
  throw new Error();
} catch (whatIsMyType) {
  console.error(whatIsMyType.message);
}

我特别要求 TypeScript JSDoc dialect, but an answer for the Closure Compiler dialect or even JSDoc itself 会很有见地。

我试过(对于 TypeScript):

try { throw new Error(); } catch (/** @type {Error} */ e) {/*...*/}
try { throw new Error(); } /** @param {Error} e*/ catch (e) {/*...*/}
/** @param {Error} e*/ try { throw new Error(); } catch (e) {/*...*/}

但是没有成功。 e 总是键入 any。有用的是

try { throw new Error(); } catch (_e) {
  /** @type {Error} */
  var e = _e;
  // ...
}

并且附加变量将被闭包编译器高级模式优化掉,但我发现从性能的角度来看(在开发构建中)这很麻烦而且不是最优的,希望有更好的方法(即我不这样做的方法) '必须创建一个人工变量来注释正确的类型)。

try {throw new Error();} catch (/** @type {Error}*/whatIsMyType) {
  console.error(whatIsMyType.message);
}

根据Closure Compiler有效。

我写的打字稿不多,但我浏览了一些资料,但大多数都没有看到 catch 级别的注释。我做的几个 see 看起来像这样;

try { throw new Error(); } catch (e: Error) {}

更新:

我认为 TypeScript 拒绝保证 check 块的类型是正确的。您可以在 try 块中抛出任何东西(有意或无意),因此编译器无法确保捕获的类型正确。在 中,解决方案是您应该检查 catch 中的类型:

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
  }
}

我(和 Robert Martin)鼓励这种类型检查,即使是强类型也是如此。

更新 2

我已将上面的示例重写为 Closure Compiler 语法,我相信这一点仍然有效。即使 Closure 允许您执行第一个示例中的定义,您可能不想(或者至少,不仅如此):

class CustomError extends Error {
  constructor() {
    super();
    /** @type {string} */
    this.aPropThatIndeedExistsInCustomError = '';
    throw new Error('Not so fast!');  // The evil part is here
  }
}


try {
  throw new CustomError();
}
catch (/**  @type {CustomError} */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
  }
}

on closure-compiler.appspot