共用体型(union型)とは?
記述方法
下記の例の場合はstringでもnumberでもどちらの型でも代入することができますよという場合の型になります。
1 2 3 |
let a: string | number; a = 'あ'; a = 2; |
Tuple(タプル)型とは?
配列の要素の型が明確にわかっている場合に使います。共用型でも同様のことが可能ですが具体的に要素の順番も指定して制約を強くしたいという場合にTuple型を使います。
記述方法
1 |
let tupple: [number, string] = [123, 'str']; |
注意点
後からpushなどで追加する場合はエラーになりません。TypeScriptの思想的には初期値のチェックはしっかりやってくれるのですが後から追加する場合などは面倒みてくれないのでそこは注意しましょう。
Literal型とは?
使って欲しいデータ型だけでなく、使って欲しい具体的な値まで縛るデータ型のことです。
書き方
下記のように縦棒で繋ぎます。
1 2 3 |
let kanjou: '喜' | '怒' | '哀' | '楽' = '楽'; kanjou = '怒'; //OK kanjou = '冷静'; //コンパイルエラーになる。 |
constの型推論
なお、constを使うことによって自動的に型推論でリテラル型になります。
1 |
const hello = "こんにちは"; |
例えば上記のような記述なら「"こんにちは"」という文字を扱うリテラル型になります。
列挙型(enum)とは?
enumには二つの使い道があります。
文字列の列挙
1 2 3 4 5 |
enum fruits { apple = "林檎", orange = "オレンジ", meron = "メロン", } |
以下のように列挙型以外の値を再代入しようとしてもエラーになります。通常のオブジェクトならこうはならないです。
1 2 3 4 5 6 7 8 9 |
enum fruits { apple = "林檎", orange = "オレンジ", meron = "メロン", } let fruit = fruits.apple; fruit = "レモン"; // NG fruit = fruits.meron; // OK |
Literal型のUnionとの比較
では、LiteralのUnion('apple' | 'orange'みたいな型)と比べると、enumは明示的に使う文字列を指定できます。
数値の列挙
列挙型を使用する事で0番から順番に番号を振っていく事が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 |
enum Week { San, Mon, Tue, Wen, Thu, Fri, Sat, } //0が出力される。 console.log(Week.San); |
連番の初期値を変えるには?
通常は連番は0から始まりますが、下記のように指定することで別番号から始める事が可能です。下記の例で言えば1から順番に連番がふられることになります。
1 2 3 4 5 6 7 8 9 |
enum Week { San = 1, Mon, Tue, Wen, Thu, Fri, Sat, } |
メリット
これを普通のJavaScriptコードで実現しようとすると連想配列を作って番号を1つ1つ振っていく必要があります。そうした場合は人手を介することになりますのでミスが発生しやすいですし、欠番号が発生しないです。
type guard
TypeScriptで変数の型がUnionとかで複数存在しうる場合に型を特定する方法です。
typeofを使う。
該当の型であることを保証します。TypeScriptの文法というよりはJavaScriptの文法です。
1 2 3 |
if (typeof a === "string") { a.toUpperCase; } |
inを使う
オブジェクトに該当のキーがあることを保証します。TypeScriptの文法というよりはJavaScriptの文法です。
1 2 3 |
if ('name' in aObj) { aObj.name } |
instanceofを使う
以下のようにCarクラスとAirPlaneクラスのどちらかだった場合でもCarクラスであることを保証します。これもJSに存在します。
1 2 3 4 5 |
a: Car | AirPlane; if (a instanceof Car) { a.run; } |
この記事へのコメントはありません。