いつの間にか、try { } catch (error) { } の errorが `unknown` になってしまう問題。
vscodeで以下のような記述をしている時に以下のような現象に出くわした。
try {
// ...
} catch (error) {
if (error.data) { // オブジェクト型は 'unknown' です。ts(2571)
throw error.data;
}
// ...
}
そんなことをTwitterで呟いたら、有識者の方が反応してくれました。
This flag is enabled under the --strict family of options. That means that if you check your code using --strict, this option will automatically be turned on. You may end up with errors in TypeScript 4.4 such as
strictモードを利用している場合、useUnknownInCatchVariablesは自動的にtrueになるようですね。
In cases where we don’t want to deal with an unknown variable in a catch clause, we can always add an explicit : any annotation so that we can opt out of stricter types.
回避策としては以下のようなコードを書くと良いとされているようです。
try {
executeSomeThirdPartyCode();
} catch (err: any) {
console.error(err.message); // Works again!
}
でも、私のプロジェクトで利用しているtypescriptの4.2.4のはず...
なぜ、4.4のTypeScriptのルールが適用されたのか?🤔
どうやらvscodeデフォルトのtypescriptバージョン(4.4.2)が適応されていたみたい。
せっかくなのでtypescriptのバージョンをプロジェクトにinstallされているnode_modulesから読み取ってくるようにする。
-
⌘ + Shift + P
でコマンドパレットを開き、typescript: select typescript version...
を入力する。
-
ワークスペースのバージョンを使用
を選択する。
上記を実施することで、プロジェクトに.vscode
フォルダが作成され、ワークスペース(プロジェクト)の設定ファイルが作成される。
リポジトリで共有できるので、チーム開発の時に便利な印象。一部プロジェクトでは設定ファイルを共有するな!みたいな文化もあったりするのだろうか?
結論
- 使ってる言語のアップデートが入ったら公式を嫁!
- 有識者の日本語翻訳もあったりするからそれを待つのでもいいから嫁!