Closed6

いつの間にか、try { } catch (error) { } の errorが `unknown` になってしまう問題。

hanetsukihanetsuki

vscodeで以下のような記述をしている時に以下のような現象に出くわした。

    try {
        // ...
    } catch (error) {
      if (error.data) { // オブジェクト型は 'unknown' です。ts(2571)
        throw error.data; 
      }
        // ...
    }
hanetsukihanetsuki

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-4.html#defaulting-to-the-unknown-type-in-catch-variables---useunknownincatchvariables

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!
}
hanetsukihanetsuki

でも、私のプロジェクトで利用しているtypescriptの4.2.4のはず...
なぜ、4.4のTypeScriptのルールが適用されたのか?🤔

hanetsukihanetsuki

どうやらvscodeデフォルトのtypescriptバージョン(4.4.2)が適応されていたみたい。

せっかくなのでtypescriptのバージョンをプロジェクトにinstallされているnode_modulesから読み取ってくるようにする。

  • ⌘ + Shift + Pでコマンドパレットを開き、typescript: select typescript version...を入力する。
  • ワークスペースのバージョンを使用を選択する。

上記を実施することで、プロジェクトに.vscodeフォルダが作成され、ワークスペース(プロジェクト)の設定ファイルが作成される。

リポジトリで共有できるので、チーム開発の時に便利な印象。一部プロジェクトでは設定ファイルを共有するな!みたいな文化もあったりするのだろうか?

hanetsukihanetsuki

結論

  • 使ってる言語のアップデートが入ったら公式を嫁!
  • 有識者の日本語翻訳もあったりするからそれを待つのでもいいから嫁!
このスクラップは2021/09/13にクローズされました