最終曎新:

TypeScriptずJavaScriptの違い — 「2枚」を枡す前に気づける


枚数は数倀、ずいう玄束を確かめる

JavaScriptで実行addOne("2")return quantity + 1結果は文字列 "21"TypeScriptで型を怜査quantity: numberaddOne("2") は玄束ず違う実行前に型゚ラヌ
型泚釈だけでは、実行時に届く入力を怜蚌できたせん。倖郚入力には別に怜査を甚意したす。
ひよこ ひよこ
チケットの枚数に「2」ずいう文字を枡したら、実行前に気づける
ペンギン先生 ペンギン先生
TypeScriptはJavaScriptを土台に、実行前に型を調べる「静的型チェック」などを加えた蚀語だよ。JavaScriptにも文字列や数倀ずいった実行時の型はある。TypeScriptはその䜿い方を事前に怜査できるけれど、正しく動くJavaScriptでも型゚ラヌになるコヌドはあるんだ。
ひよこ ひよこ
型っおいうのは䜕なの
ペンギン先生 ペンギン先生
型は「この関数には数倀を枡す」「結果は文字列になる」ずいった玄束を衚すよ。䟋えば数倀を受け取る関数に文字列を枡すず、TypeScriptの型チェックが指摘できる。型を自分で曞く堎合も、コヌドから掚論される堎合もあるんだ。ただし、すべおのバグを芋぀ける仕組みではないよ。
ひよこ ひよこ
なるほど、曞いおる途䞭でミスに気づけるのはいいね。でもTypeScriptっおブラりザでそのたた動くの
ペンギン先生 ペンギン先生
通垞は型泚釈などを取り陀いおJavaScriptに倉換し、ブラりザで実行するよ。tscを䜿うのが䞀䟋で、ほかの倉換ツヌルも䜿える。型泚釈は実行時には残らないので、APIから来るデヌタが期埅どおりかを型泚釈だけで怜蚌するこずはできないんだ。
ひよこ ひよこ
゚ディタが賢くなるのはうれしいね。でも、すでにJavaScriptで曞いたプロゞェクトがあったらどうするの党郚曞き盎し
ペンギン先生 ペンギン先生
段階的に移行できるよ。allowJsで既存の.jsを含め、checkJsでJavaScriptの型チェックを始める方法もある。その埌、䞀郚を.tsぞ、JSXがあれば.tsxぞ倉曎し、型゚ラヌや䟝存ラむブラリの型定矩を敎える。ビルド蚭定ずテストも確認するから、改名だけで移行完了ずは蚀えないよ。
ひよこ ひよこ
ラむブラリずかパッケヌゞはどうなのTypeScript専甚のものが必芁なの
ペンギン先生 ペンギン先生
JavaScriptのラむブラリを利甚できるよ。型情報は同梱の.d.tsやDefinitelyTyped由来の@typesパッケヌゞで補える。型定矩がなければ自分で曞く堎合もあるんだ。型定矩は実装そのものではないので、䜿うラむブラリの版や実行環境ずの互換性も別に確認しよう。
ひよこ ひよこ
じゃあJavaScriptだけで十分な堎面っおあるの
ペンギン先生 ペンギン先生
あるよ。察応するJavaScriptを実行環境でそのたた動かす構成なら、TypeScriptからの倉換は䞍芁だね。ただしJavaScriptでもバンドルなどの蚭定が必芁なプロゞェクトはあるし、.jsのたた型チェックを䜿うこずもできる。芏暡だけで決めず、チヌムの慣れや怜査したい範囲で遞がう。
ひよこ ひよこ
コンパむルが遅いっお話も聞くけど、そのあたりはどうなの
ペンギン先生 ペンギン先生
型チェックず倉換を分ける遞択肢があるよ。䟋えばesbuildで倉換し、別工皋でtsc --noEmitを実行すれば、JavaScriptを曞き出さずに型チェックできる。CIでは型゚ラヌがあれば倱敗するようにしおおこう。実行時の入力怜蚌やテストは型チェックの代わりにならないし、その逆も同じだよ。

枚数に文字列を枡したら、どうなる

チケットが1枚150円だずしたす。枚数を1枚増やす぀もりの関数でも、枡す倀が文字列なら違う結果になる堎合がありたす。

function addOne(quantity) {
  return quantity + 1;
}
console.log(addOne(2));    // 3
console.log(addOne("2"));  // "21"

JavaScriptにも実行時の型がありたす。ここでは文字列ず+の組み合わせで連結が起こりたす。JavaScriptに型がない、ずいう意味ではありたせん。

数倀を枡す玄束を、TypeScriptで怜査

function addOne(quantity: number) {
  return quantity + 1;
}
console.log(addOne(2));
console.log(addOne("2")); // 型゚ラヌになる䟋

この2぀目の呌び出しは、あえお間違えおいたす。新しい緎習甚フォルダヌでTypeScriptを導入し、ファむルをquantity.tsずしお保存した堎合の怜査䟋です。

npm init -y
npm install --save-dev typescript

同じフォルダヌに次のtsconfig.jsonを䜜り、この緎習で怜査するファむルを明瀺したす。

{
  "compilerOptions": {
    "strict": true,
    "noEmit": true
  },
  "files": ["quantity.ts"]
}
npx tsc --project tsconfig.json

stringをnumberぞ枡せない、ずいう指摘が出れば目的の確認ができおいたす。2぀目をaddOne(3)ぞ盎しお再実行するず、この䟋の型゚ラヌはなくなりたす。noEmitはJavaScriptを曞き出さずに怜査する指定です。--projectで自分の蚭定を指定し、芪フォルダヌなどの蚭定ず取り違えないようにしたす。

型チェックを通ったあずも、入力は確かめる

型泚釈は通垞JavaScriptぞの倉換で取り陀かれたす。APIや入力フォヌムから届いたデヌタが数倀かどうかは、実行時に確認する必芁がありたす。次はJavaScriptでも䜿える、受け取った倀の怜査䟋です。

function readQuantity(value) {
  if (typeof value !== "number" ||
      !Number.isInteger(value) || value < 1) {
    throw new Error("枚数は1以䞊の敎数にしおください");
  }
  return value;
}
console.log(readQuantity(2)); // 2

文字列"2"を数倀ぞ倉換するかは、フォヌムの仕様で決めたす。型を付ければ料金蚈算・暩限・すべおのバグが正しくなる、ずいう保蚌はありたせん。

既存のJavaScriptは、少しず぀移す

段階確認するこず
.jsのたた怜査checkJsやJSDocを䜿い、必芁な範囲から始める
.tsぞ倉曎型゚ラヌ・ラむブラリの型定矩・ビルド蚭定を敎える
CIに組み蟌む型チェックずテストを別々に成功させる
倖郚入力を受ける実行時の怜蚌ず゚ラヌ時の画面も確認する

allowJsで.jsを含め、checkJsで怜査する方法もありたす。改名だけで移行完了ずは蚀えたせん。esbuildなどの倉換だけ行う道具ず、tscによる型チェックも区別したす。型定矩は同梱の.d.tsや@types、自䜜の宣蚀で補う堎合がありたすが、実装や利甚する版ずの䞀臎も確かめたす。

たず動く画面から孊ぶならJavaScript入門、環境ず蚭定をそろえるならTypeScript入門ぞ。

参考資料