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