メインコンテンツまでスキップ

useUnknownInCatchVariables

useUnknownInCatchVariablesは例外捕捉catch(e)eをunknown型として扱うコンパイラオプションです。

  • デフォルト: strictが有効の場合はtrue、それ以外はfalse
  • 追加されたバージョン: 4.4
  • TypeScript公式が有効化推奨

解説

JavaScript はいかなる値も例外として投げることができます。そのため捕捉した値はany型でした。

ts
// case 1
try {
throw new Error();
} catch (err) {
var err: any
}
 
// case 2
try {
throw "This is an error!";
} catch (err) {
var err: any
}
 
// case 3
try {
throw undefined;
} catch (err) {
var err: any
}
ts
// case 1
try {
throw new Error();
} catch (err) {
var err: any
}
 
// case 2
try {
throw "This is an error!";
} catch (err) {
var err: any
}
 
// case 3
try {
throw undefined;
} catch (err) {
var err: any
}

この混沌は TypeScript4.0 でようやく整理されることとなりました。捕捉した値に対してunknown型を明記することによって捕捉した値の型はわからないものの型安全を獲得できるようになりました。

ts
// case 1
try {
throw new Error();
} catch (err) {
var err: any
}
 
// case 2
try {
throw "This is an error!";
} catch (err: unknown) {
var err: unknown
}
 
// case 3
try {
throw undefined;
} catch (err: unknown) {
var err: unknown
}
ts
// case 1
try {
throw new Error();
} catch (err) {
var err: any
}
 
// case 2
try {
throw "This is an error!";
} catch (err: unknown) {
var err: unknown
}
 
// case 3
try {
throw undefined;
} catch (err: unknown) {
var err: unknown
}

今回のオプションはこの機能を常時有効にするものです。例外が捕捉した値は型の明記をすることなくすべてがunknown型として解釈されるようになります。

ts
// case 1
try {
throw new Error();
} catch (err) {
var err: unknown
}
 
// case 2
try {
throw "This is an error!";
} catch (err) {
var err: unknown
}
 
// case 3
try {
throw undefined;
} catch (err) {
var err: unknown
}
ts
// case 1
try {
throw new Error();
} catch (err) {
var err: unknown
}
 
// case 2
try {
throw "This is an error!";
} catch (err) {
var err: unknown
}
 
// case 3
try {
throw undefined;
} catch (err) {
var err: unknown
}

また、この制限を緩くしたい。つまりunknown型ではなくany型にしたいのであれば捕捉した値に対しany型を明記してください。

  • 質問する ─ 読んでも分からなかったこと、TypeScriptで分からないこと、お気軽にGitHubまで🙂
  • 問題を報告する ─ 文章やサンプルコードなどの誤植はお知らせください。