投稿日:2020年11月15日
TypeScriptの型推論のAny型には十分注意する必要があります。TSConfigではこの型推論を禁止することができます。
この記事ではTypeScriptにおけるany型の危険性と、TSConfigを使ってこの危険な型の使用を禁止する方法について解説しています。
/**
* greetingをユーザーに表示
*/
function helloWorld(greeting){
alert(greeting.trim())
}
// 10をユーザーに表示
helloWorld(10);
おそらく関数の作成者は、helloWorld()をgreetingという引数で挨拶の文言を表すstringを受け取り、trim()によって邪魔な空白を削除しユーザーに表示する関数として書いたのでしょう。
しかし、あろうことかこの関数を使う場面になって
『greetingをユーザーに表示…?よし、10という数字をユーザーに表示したいからこの関数を使おう』
と考えてしまったのです。
当然、numberにtrim()は存在しないため、このコードにはバグがあるわけですが、どういうわけかこのコードのトランスパイルは正常終了してしまいます。
実際にエラーが発生するのはトランスパイル後のコードを実行するタイミング…‥
最悪です!!!
$ tsc sample.ts // 正常終了
$ node sample.js // エラー!!!!
優秀エンジニア「any型がコード内に残っていると危険なので、全て別の型になおそう!!まずはエディタの検索機能でanyを検索だ!!!」
と、考えた勇者のようなエンジニアがいたとしましょう。しかし、プロジェクト内を『any』で検索しても暗黙的に推論されたany型は表示されないのです。
優秀エンジニア「コード内のany型はすべて消えたよ!!」
トランスパイラ「見た目の上ではなwwww」
この問題はtsconfig.jsonの設定で解決できます。
tsconfigにはnoImplicitAnyという設定項目があります。
この設定をtrueにすると、型推論でany型を推論しそうな時はエラーを出力してくれます。
{
"compilerOptions": {
"noImplicitAny": true
}
}
これだけです!!
これでトランスパイルはしっかり失敗してくれるし、VSCodeなどのエディタでも暗黙的なanyはエラーとして表示してくれます!!
$ tsc
sample.ts:1:21 - error TS7006: Parameter 'greeting' implicitly has an 'any' type.
1 function helloWorld(greeting){
~~~~~~~~
Found 1 error.
もちろん、禁止されたのは型推論のany型のみをなので、通常の型推論は問題なく使用できます。
function helloWorld(greeting:string){
console.log(greeting.trim())
}
let greeting = " hello world "; // 文字列への型推論
helloWorld(greeting);