try {throw new Error();} catch (/** @type {Error}*/whatIsMyType) {
console.error(whatIsMyType.message);
}
Действителен в соответствии с Закрывающим компилятором .
Я не пишу много машинописи, но я искал несколько источников и в основном не вижу аннотаций на уровне catch
. Те немногие, что я сделал см. , выглядели так:
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
}
}
для ☝?
И я (и Роберт Мартин ) поощряю этот стиль проверки типов даже с сильными типами.
Обновление 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
}
}
на closure-compiler.appspot