基本の型
- イントロダクション
- Boolean
- Number
- String
- Array
- Tuple
- Enum
- Any
- Void
- NullとUndefined
- Never
- 型注釈(Type assertions)
- letに関する注意
イントロダクション
プログラムが有用であるために、データの単位を数値、文字列、構造、真偽の値のような最も単純な単位で動作させる必要があります。 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
void
はany
とは反対のような存在であり、如何なる型も存在しないことを表します。
一般的に、これは戻り値の無い関数の戻り値の型として見かけることがあるでしょう。
function warnUser(): void {
alert("This is my warning message");
}
void
型の変数宣言は、undefined
またはnull
しか割り当てることが出来ないため、有用とは言えません。
let unusable: void = undefined;
NullとUndefined
TypeScriptではundefined
とnull
の両方に、
それぞれundefinedとnullという自身の型を持ちます。
voidと同じく、それだけで特に役に立つというわけではありません。
// Not much else we can assign to these variables!
let u: undefined = undefined;
let n: null = null;
デフォルトで、null
とundefined
は全ての他の型の部分型(subtype)になります。
これは、number
のようなものにnull
とundefined
が割り当てられることを意味します。
ただし、--strictNullChecks
を使用した場合は、
null
とundefined
はvoid
とそれぞれの型にしか割り当てることができなくなります。
これは、多くの陥りがちなエラーを回避するのに役立ちます。
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
の代わりにこれを使用するべきでしょう。
© https://github.com/Microsoft/TypeScript-Handbook
このページは、ページトップのリンク先のTypeScript-Handbook内のページを翻訳した内容を基に構成されています。 下記の項目を確認し、必要に応じて公式のドキュメントをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。
- ドキュメントの情報が古い可能性があります。
- "訳注:"などの断わりを入れた上で、日本人向けの情報やより分かり易くするための追記を行っている事があります。