基本の型

イントロダクション

プログラムが有用であるために、データの単位を数値、文字列、構造、真偽の値のような最も単純な単位で動作させる必要があります。 TypeScriptでは、便利なenum(列挙)型を含む、JavaScriptで期待されるであろう多くの型をサポートします。

Boolean

最も基本的なデータ型であり、単純にtrue/falseの値を持ちます。 JavaScriptとTypeScriptでboolean値として扱われます。

let isDone: boolean = false;

Number

JavaScriptのように、TypeScriptの全ての数値は浮動小数点数の値です。 これらの浮動小数点数は数値の型を扱います。 16進数と10進数に加え、TypeScriptではECMAScript 2015で導入された2進数(binary)と8進数もサポートします。

let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;

String

Webページやサーバー用のJavaScriptによるプログラム作成の重要な部分のひとつにテキストデータの扱いがあります。 他の言語のように、これらのテキストデータを参照するために文字列の型を使用します。 JavaScriptと同様に、TypeScriptもダブルクォート(")またはシングルクォート(')で文字列データを囲みます。

let color: string = "blue";
color = 'red';

また、複数行を取り扱うことが可能で式を埋め込むことの出来る、テンプレート文字列も使用することが可能です。 これらの文字列はバッククォート(`)文字で囲み、埋め込み式は${ expr }の形式を使用します。

let fullName: string = `Bob Bobbington`;
let age: number = 37;
let sentence: string = `Hello, my name is ${ fullName }.

I'll be ${ age + 1 } years old next month.`

sentenceは、下記のように定義したことと同義になります。

let sentence: string = "Hello, my name is " + fullName + ".\n\n" +
    "I'll be " + (age + 1) + " years old next month."

Array

TypeScriptはJavaScriptのように、値の配列を用いることが可能です。 配列(Array)型は2つの方法で書くことができます。 1つ目は、要素の型の配列を示すのに、[]の後に要素の型を使用する方法です。

let list: number[] = [1, 2, 3];

ふたつ目は、Array<elemType>のようにして、ジェネリック配列型を使用する方法です。

let list: Array<number> = [1, 2, 3];

Tuple

タプル型は、要素の個数・型が決められた配列を表現することを可能にします。 例えば、あなたが文字列と数値のペアを値として表現したいとした場合は次のようにします。

// タプル型の宣言
let x: [string, number];
// 初期化
x = ["hello", 10]; // OK
// 不適切な初期化
x = [10, "hello"]; // Error

予め把握しているインデックスの要素にアクセスすれば、正しい型が取得できます。

console.log(x[0].substr(1)); // OK
console.log(x[1].substr(1)); // Error, 'number' does not have 'substr'

予め設定した範囲外の要素にアクセスした場合は、代わりに共用体型(union type)が使用されます。

x[3] = "world"; // OK, 'string' can be assigned to 'string | number'

console.log(x[5].toString()); // OK, 'string' and 'number' both have 'toString'

x[6] = true; // Error, 'boolean' isn't 'string | number'

共用体型(union type)は、この後の章で説明します。

Enum

JavaScriptの標準的なデータ型の助けとなる追加の型に、enumがあります。 C#言語のように、数値の集合の名付けをより分かりやすくしてくれるものです。

enum Color {Red, Green, Blue};
let c: Color = Color.Green;

デフォルトでは、enumのメンバへの数値の割り当ては0から始まります。 メンバのひとつへ値を手動で設定することで、これを変更することが可能です。 例えば、下記は前述の例を0の代わりに1から始まるように設定しています。

enum Color {Red = 1, Green, Blue};
let c: Color = Color.Green;

また、下記は全てのenumの値に対して設定しています。

enum Color {Red = 1, Green = 2, Blue = 4};
let c: Color = Color.Green;

enumの便利な機能として、数値からenumの値の名前にすることも可能であることが挙げられます。 例えば、2の値を持っているが、これが上記のColorのenumの何にマップするのか分からなくても、 対応する名前を見つけ出すことができます。

enum Color {Red = 1, Green, Blue};
let colorName: string = Color[2];

alert(colorName);

Any

アプリケーションを書いていると、値の型の記述は必要だが、その型が分からないケースが存在します。 これらの値は、例えばユーザーや3rdパーティ製のライブラリなどの動的なコンテンツからの値かもしれません。 こういったケースでは型チェックは諦め、コンパイル時のチェックは通してしまうようにしましょう。 これをするために、any型を割り当てます。

let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean

any型は既存のJavaScriptを動作させる強力な方法であり、 コンパイル時の型チェックを受ける・受けないを徐々に進めていくための助けになってくれます。

あなたはObjectに対して、他の言語でそうであるように、役割のようなものを演じることを期待するかもしれません。 ただし、Object型の変数では、それらに割り当てられた値しか使用することができず、 実際に存在するメソッドであったとしても、任意のメソッドを呼び出すことが出来ません。

let notSure: any = 4;
notSure.ifItExists(); // okay, ifItExists might exist at runtime
notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check)

let prettySure: Object = 4;
prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.

一部の型は分かってはいるものの、それが全てかどうか分からないような場合にもany型は便利です。 例えば、異なる型が混合した配列を持つようなケースが挙げられます。

let list: any[] = [1, true, "free"];

list[1] = 100;

Void

voidanyとは反対のような存在であり、如何なる型も存在しないことを表します。 一般的に、これは戻り値の無い関数の戻り値の型として見かけることがあるでしょう。

function warnUser(): void {
    alert("This is my warning message");
}

void型の変数宣言は、undefinedまたはnullしか割り当てることが出来ないため、有用とは言えません。

let unusable: void = undefined;

NullとUndefined

TypeScriptではundefinednullの両方に、 それぞれundefinedとnullという自身の型を持ちます。 voidと同じく、それだけで特に役に立つというわけではありません。

// Not much else we can assign to these variables!
let u: undefined = undefined;
let n: null = null;

デフォルトで、nullundefinedは全ての他の型の部分型(subtype)になります。 これは、numberのようなものにnullundefinedが割り当てられることを意味します。

ただし、--strictNullChecksを使用した場合は、 nullundefinedvoidとそれぞれの型にしか割り当てることができなくなります。 これは、多くの陥りがちなエラーを回避するのに役立ちます。

stringまたはnullまたはundefinedのいずれかの型でパスさせたい場合は、 共用体型(union type)のstring | null | undefinedを使用します。 共用体型(union type)については、後ほど学習します。

注意:可能であれば--strictNullChecksを使用することをお勧めしますが、 このハンドブックでは、これはOFFにしているとみなして説明しています。

Never

never型は決して発生することのない値の型を表します。 例えば、neverは常に例外をスローする、または決して戻り値を返さない関数式またはアロー関数式の戻り値の型になります。 また、型の保護によって狭められ、絶対に真(true)にならない場合にnever型の値になります。

never型は全ての型の部分型(subtype)であり、全ての型に割り当て可能ですが、 never自身を除き、どのような型もneverの部分型(subtype)にならず、割り当てることも出来ません。 anyでさえも、neverに割り当てることはできません。

下記は、neverを返す関数の例になります。

// neverを返す関数は、終点への到達を不可にしなければいけません
function error(message: string): never {
    throw new Error(message);
}

// 戻り値はneverと推論されます
function fail() {
    return error("Something failed");
}

// neverを返す関数は、終点への到達を不可にしなければいけません
function infiniteLoop(): never {
    while (true) {
    }
}

型注釈(Type assertions)

時折、TypeScriptより、あなたのほうが値について良く分かっているというケースが存在します。 通常これは何らかのエンティティが、現在の型よりも更に詳細に特定できる型であると、あなたが分かっているようなケースで発生します。

型注釈(type assertion)は、コンパイラに「私を信じて。これが何なのか分かっている。」と伝えるようなものです。 型注釈は他の言語での型キャストのようなものですが、 データの特別なチェックやデータの再構築を行いません。

これは純粋にコンパイラで使用されるもので、ランタイム時に影響を与えるものではありません。 TypeScriptは、あなた(プログラマー)が必要な特別なチェックを施しているとみなします。

型注釈はふたつの形式を持ちます。 ひとつは"角括弧"文法です。

let someValue: any = "this is a string";

let strLength: number = (<string>someValue).length;

もうひとつは、as文法です。

let someValue: any = "this is a string";

let strLength: number = (someValue as string).length;

ふたつの例は同じ意味になります。 どちらを選択するかは、ほとんど好みの問題になりますが、 JSXを使用するTypeScriptではas形式のアサーションしか使用できません。

letに関する注意

あなたは、我々がこれまでJavaScriptのvarキーワードの代わりに、 letキーワードを使用してきたことに気が付いているでしょう。 letキーワードは、実際に新しいJavaScriptの構成体であり、TypeScriptで利用可能にしています。

これについては後ほど詳しく説明しますが、JavaScriptの多くの一般的な問題がletを使用することで軽減されるため、 可能な限りvarの代わりにこれを使用するべきでしょう。

 Back to top

© https://github.com/Microsoft/TypeScript-Handbook

このページは、ページトップのリンク先のTypeScript-Handbook内のページを翻訳した内容を基に構成されています。 下記の項目を確認し、必要に応じて公式のドキュメントをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • ドキュメントの情報が古い可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報やより分かり易くするための追記を行っている事があります。