useUnknownInCatchVariables
useUnknownInCatchVariables
は例外捕捉catch(e)
のe
をunknown型として扱うコンパイラオプションです。
- デフォルト: strictが有効の場合は
true
、それ以外はfalse
- 追加されたバージョン: 4.4
- TypeScript公式が有効化推奨
解説
JavaScript はいかなる値も例外として投げることができます。そのため捕捉した値はany
型でした。
ts
// case 1try {throw newError ();} catch (err ) {}// case 2try {throw "This is an error!";} catch (err ) {}// case 3try {throwundefined ;} catch (err ) {}
ts
// case 1try {throw newError ();} catch (err ) {}// case 2try {throw "This is an error!";} catch (err ) {}// case 3try {throwundefined ;} catch (err ) {}
この混沌は TypeScript4.0 でようやく整理されることとなりました。捕捉した値に対してunknown
型を明記することによって捕捉した値の型はわからないものの型安全を獲得できるようになりました。
ts
// case 1try {throw newError ();} catch (err ) {}// case 2try {throw "This is an error!";} catch (err : unknown) {}// case 3try {throwundefined ;} catch (err : unknown) {}
ts
// case 1try {throw newError ();} catch (err ) {}// case 2try {throw "This is an error!";} catch (err : unknown) {}// case 3try {throwundefined ;} catch (err : unknown) {}
今回のオプションはこの機能を常時有効にするものです。例外が捕捉した値は型の明記をすることなくすべてがunknown
型として解釈されるようになります。
ts
// case 1try {throw newError ();} catch (err ) {}// case 2try {throw "This is an error!";} catch (err ) {}// case 3try {throwundefined ;} catch (err ) {}
ts
// case 1try {throw newError ();} catch (err ) {}// case 2try {throw "This is an error!";} catch (err ) {}// case 3try {throwundefined ;} catch (err ) {}
また、この制限を緩くしたい。つまりunknown
型ではなくany
型にしたいのであれば捕捉した値に対しany
型を明記してください。