事象
Typescript2.3.4を使っている息の長いWebシステムでnpm installをし直し、tscビルドし直したらトランスパイルエラーが発生。「unknown」という型を見つけられませんとwebpack越しにtscコマンドがこけます。
[14:27:05] transpile started ...
[14:27:25] typescript: C:/src/pwa/awsomeapp/node_modules/raven-js/typescript/raven.d.ts, line: 205
Cannot find name 'unknown'.
L206: * Manually send a message to Sentry
原因
unknown型はTypescript3から実装されている型なので、Typescript2環境では使えません。自分のコードで使っていなくても、npm installした依存モジュールが使っている場合、tscトランスパイルに失敗します。
今回の場合、エラーログ収集サーバであるSentryに対してフロントからエラーログを投げる為に入れているraven-jsで発生しました。npm installし直したことでraven-js@3.26.2から3.27.1にバージョンが上がり、この過程で開発元がTypescript3を使い始めたのかタイプ定義(raven.d.ts)内でunknown型を使用していました。
captureException(
ex: unknown, ← これ
options?: RavenOptions
): RavenStatic;
結果、Typescript2環境では事象のトランスパイルエラーが発生してしまいます。
対処
unknown型を解決出来るpolyfillを入れます。
$ npm install unknown-ts --save-dev
+ unknown-ts@0.1.0
added 1 package and removed 1 package in 66.533s
後は読み込みルートになるts(ionicやangularであればapp.modules.tsとか)に以下を入れればunknown型が使えるようになります。
import "unknown-ts";
再度ビルド実行して事象のエラーが発生しなくなることを確認します。
まとめ
インストールしたunknown-tsの内容はたったこれだけです。
export type mixed = { [key: string]: any } | object | number | string | boolean | symbol | undefined | null | void
declare global {
type unknown = mixed
}
これと同じ記述を読み込みルートになるtsに書いてあげればunknown-tsをインストールしなくても解決します。
ですがTypescriptは2系のままの環境でも、tslintのバージョンは結構上がっていたりしてunknown型のことを知っていて、新規にunknown型を定義しようとすると今度はtslintに注意されるハメになります。
ビルドは通るようにはなりますが、VSCode上でtslintエラーが表示されてしまうのは精神的にスッキリしないので、素直にunknown-tsを入れて今はそっと蓋をしました。
Typescriptを3系に上げたらnpm uninstallするのを忘れないようにしないとですね。