TypeScript ~基礎編~ 型

TypeScriptの重要な機能である「型」について学びましょう!

環境構築

以下の記事で作成したプロジェクトを使います。
※TypeScriptが動けば問題ありません

型の種類

内容
number 整数や浮動小数点を含む整数値 1, 30.3, -5
string 全ての文字列 ‘I’, “My”
boolean 真偽値 true or false
object JavaScriptのObject型 {name: “selfnote”}
Array JavaScriptのArray型 [1, 2, 3]
Tuple TypeScriptの独自の型: 固定長 [1, 2]
Enum TypeScriptの独自の型: 列挙型 enum { NEW, OLD }
any どんな型でも良い。型を指定しない。 *(アスタリスク)

TypeScriptで型を利用する方法

まずは、通常のJavaScriptを書いてみます。

これは単純な例ですが、TypeScriptの便利さを実感するのに役立ちます。

上記の出力結果は、「3」になります。

しかし、以下の場合はどうなるでしょうか。

引数の一つをstring型にしました。JavaScriptの場合、Typeが異なっていてもエラーを発生させずに処理をします。

結果は以下のようになります。

これは、明らかなバグです。JavaScriptはこういうところがめんどくさいのです。

しかし、TypeScriptの型定義を活用すれば、この問題は解決されます。

sum関数の引数に型を追加しました。TypeScriptではこのように「:type」で型を指定します。

型にはnumber型を指定したので、sum関数に「数値以外」受け付けなくなりました。

例えば、先ほどの例のように引数の一つをstring型にすると、以下のエラーメッセージが表示されます。

補足) 型の大文字・小文字

Typscriptでは、stringやnumberのような小文字で型を指定します。StringやNumberなどの大文字ではありません。

型推論(TypInference)

TypeScriptには、型推論と呼ばれる型を自動的に判断する機能が備わっています。

先ほどのサンプルから例に挙げると、result変数の部分がそれに当たります。

型推論

resultには、number型が入るとTypeScriptが判断しており、そしてそれは正しいです。

TypeScriptが正しく型を推論する場合は、型を指定しないほうが良いです。

Tuple型について

Tuple型は長さが固定化されている配列です。

JavaScriptにはない型なので、使い方をみてみましょう。 

Personオブジェクトを定義して、Tupleを設定してみます。

オブジェクトに型を定義するときは、 変数名に「: {}」をつけます。

そして、Tupleにする場合は、[“type”]を指定します。Array型と指定方法が異なることがわかると思います。

Enum型について

TypeScriptでは、Enum型を設定することが可能です。

Union型について

型指定には、2つ以上の型を指定することが可能です。

Union型を使うには型指定時に「|」で型を区切る必要があります。この例だとnumberかstringの型をどちらでも受け取れる様にしました。

3つの場合は、このようになります。

また、型指定しただけでは、渡された引数がnumber型かstring型かをTypeScriptが判断することができないので、typeof演算子で型チェックをする必要があります

Literal型

Literal型は、型付けにnumberやstringなどを指定するのではなく、「値そのものを指定する」型です。

この例では、「type: “as-string” | “as-number”」をLiteral型として定義しました。as-stringとas-numberは任意の値です。

型エイリアス / カスタム型

型にエイリアスをつけることが可能です。

エイリアスを定義する場合は、「type」キーワードを使用します。

先ほどよりかなりスッキリしたと思います。

型エイリアスは、Object型に対しても実装可能です。

戻り値の型とvoid型

function型には戻り値の型があります。

これまでの戻り値の型は、TypeScriptが型推論してくれていました。

sum関数の戻り値の型はnumber型

自分で明示的に型を指定することもできますが、TypeScriptが型推論してくれる場合は、無理に書く必要はありません。

TypeScriptには、void型も持っています。void型は、関数が何も返さないことを明示的に指定します。

bookInfo関数の戻り値の型はvoid型

function型

TypeScriptには、関数であることを示すfunction型があります。

より正確に型を指定する場合は、以下のようにします。

コールバックにも応用できます。

sumCallのsumがコールバックです。ここには、明示的にどのようなfunction型を受け取るのか指定しています。

Unknown型 / Any型

Unknown型は、最終的にどのような型になるかわからないということを意味します。

一方、Any型は全ての型(string, number, functionなど)を受け入れます。

any型はTypeScriptが型チェックをしないため、どのような型に代入してもエラーになりません。一方、unkown型はエラーになります。

エラーを回避したい場合は、型チェックを行う必要があります。

どのような型を指定すれば良いかわからない場合、any型よりunknown型を使う方が安全です。上記のように型チェックをする必要があるためです。

never型

never型は関数の戻り値の型として指定できます。

そして、これは「値を絶対に返さない」ことを明示的に示す役割を持っています。

例外を発生させる時など、プログラムがクラッシュするような場面で使用します。

index型

index型は、オブジェクトを作成するときにそのプロパティを柔軟に定義するために使用します。

例えば、クラスのプロパティに対して、値チェック(バリデーションチェック)をしたいとします。

プロパティには、emailやuserなどがあり、それぞれに正しい値が設定しているかどうかを確認したいところですが、クラスにどのようなプロパティが設定されているかは分からない、といった状況でindex型は役に立ちます。

index型は、こんな感じです。ちょっとわかりずらいかもしれませんが、実際に使ってみましょう。

上記のようにindex型として定義したinterfaceをオブジェクトの型として指定すればOKです。

おわりに

本記事では、TypeScriptで使用する型について一通り学習しました。

種類がたくさんあるので、使いこなすことが難しそうですね^^;

練習あるのみだと思うので、実際にプログラムを書きながら学んでいきましょう!

それでは、また!

参考書籍