プログラムが役に立つためには、数値、文字列、構造体、真偽値など、最も単純なデータ単位を扱うことができなければなりません。TypeScriptでは、JavaScriptで期待されるのと同じ型をサポートしており、列挙型を追加して処理を支援しています。
真偽値(Boolean)
最も基本的なデータ型は、単純なtrue/false値であり、JavaScriptとTypeScriptでは`boolean`値と呼ばれます。
tsTry
letisDone : boolean = false;
数値(Number)
JavaScriptと同様に、TypeScriptのすべて数値は浮動小数点数値またはBigIntです。これらの浮動小数点数には`number`型が、BigIntには`bigint`型が割り当てられます。16進数と10進数のリテラルに加えて、TypeScriptはECMAScript 2015で導入された2進数と8進数のリテラルもサポートしています。
tsTry
letdecimal : number = 6;lethex : number = 0xf00d;letbinary : number = 0b1010;letoctal : number = 0o744;letbig : bigint = 100n;
文字列(String)
Webページとサーバーの両方でJavaScriptを使用してプログラムを作成する際のもう1つの基本的な部分は、テキストデータの処理です。他の言語と同様に、これらのテキストデータ型を参照するために`string`型を使用します。JavaScriptと同様に、TypeScriptも文字列データを囲むために二重引用符(`"`)または単一引用符(`'`)を使用します。
tsTry
letcolor : string = "blue";color = 'red';
複数行にまたがり、式を埋め込むことができる*テンプレート文字列*も使用できます。これらの文字列はバックティック/バッククォート(```)文字で囲まれ、埋め込まれた式は`${ expr }`の形式になります。
tsTry
letfullName : string = `Bob Bobbington`;letage : number = 37;letsentence : string = `Hello, my name is ${fullName }.I'll be ${age + 1} years old next month.`;
これは、次のように`sentence`を宣言するのと同じです。
tsTry
letsentence : string ="Hello, my name is " +fullName +".\n\n" +"I'll be " +(age + 1) +" years old next month.";
配列(Array)
TypeScriptは、JavaScriptと同様に、値の配列を扱うことができます。配列型は、2つのいずれかの方法で記述できます。1つ目は、要素の型の後に`[]`を使用して、その要素型の配列を示します。
tsTry
letlist : number[] = [1, 2, 3];
2つ目の方法は、ジェネリック配列型`Array<elemType>`を使用します。
tsTry
letlist :Array <number> = [1, 2, 3];
タプル(Tuple)
タプル型を使用すると、型のわかっている固定数の要素を持つ配列を表現できますが、同じ型である必要はありません。たとえば、値を`string`と`number`のペアとして表す場合があります。
tsTry
// Declare a tuple typeletx : [string, number];// Initialize itx = ["hello", 10]; // OK// Initialize it incorrectlyType 'number' is not assignable to type 'string'.x = [10 ,"hello" ]; // Error
Type 'string' is not assignable to type 'number'.2322
2322Type 'number' is not assignable to type 'string'.
Type 'string' is not assignable to type 'number'.
既知のインデックスを持つ要素にアクセスすると、正しい型が取得されます。
tsTry
// OKconsole .log (x [0].substring (1));Property 'substring' does not exist on type 'number'.2339Property 'substring' does not exist on type 'number'.console .log (x [1].(1)); substring
既知のインデックスのセット外の要素にアクセスしようとすると、エラーが発生します。
tsTry
Tuple type '[string, number]' of length '2' has no element at index '3'.2493Tuple type '[string, number]' of length '2' has no element at index '3'.x [3 ] = "world";Object is possibly 'undefined'.console .log (x [5 ].toString ());
Tuple type '[string, number]' of length '2' has no element at index '5'.2532
2493Object is possibly 'undefined'.
Tuple type '[string, number]' of length '2' has no element at index '5'.
列挙型
JavaScriptの標準データ型セットに役立つ追加機能として、enum
(列挙型)があります。C#などの言語と同様に、列挙型は数値のセットにわかりやすい名前を付ける方法です。
tsTry
enumColor {Red ,Green ,Blue ,}letc :Color =Color .Green ;
デフォルトでは、列挙型はそのメンバーの番号付けを0
から開始します。これは、メンバーのいずれかの値を手動で設定することで変更できます。たとえば、前の例を0
ではなく1
から開始できます。
tsTry
enumColor {Red = 1,Green ,Blue ,}letc :Color =Color .Green ;
または、列挙型のすべての値を手動で設定することもできます。
tsTry
enumColor {Red = 1,Green = 2,Blue = 4,}letc :Color =Color .Green ;
列挙型の便利な機能は、数値から列挙型のその値の名前に変換できることです。たとえば、値2
があるが、上記のColor
列挙型でそれが何を表しているかわからない場合は、対応する名前を調べることができます。
tsTry
enumColor {Red = 1,Green ,Blue ,}letcolorName : string =Color [2];// Displays 'Green'console .log (colorName );
...不明な型
アプリケーションを作成するときに、わからない変数の型を記述する必要がある場合があります。これらの値は、ユーザーからの入力など、動的なコンテンツから取得される場合や、APIですべての値を意図的に受け入れる場合があります。このような場合、コンパイラと将来の読者にこの変数が何でもありうることを伝える型を提供したいので、unknown
型を指定します。
tsTry
letnotSure : unknown = 4;notSure = "maybe a string instead";// OK, definitely a booleannotSure = false;
unknown
型の変数がある場合は、typeof
チェック、比較チェック、または後の章で説明するより高度な型ガードを実行することで、より具体的な型に絞り込むことができます。
tsTry
declare constmaybe : unknown;// 'maybe' could be a string, object, boolean, undefined, or other typesconstType 'unknown' is not assignable to type 'number'.2322Type 'unknown' is not assignable to type 'number'.: number = aNumber maybe ;if (maybe === true) {// TypeScript knows that maybe is a boolean nowconstaBoolean : boolean =maybe ;// So, it cannot be a stringconstType 'boolean' is not assignable to type 'string'.2322Type 'boolean' is not assignable to type 'string'.: string = aString maybe ;}if (typeofmaybe === "string") {// TypeScript knows that maybe is a stringconstaString : string =maybe ;// So, it cannot be a booleanconstType 'string' is not assignable to type 'boolean'.2322Type 'string' is not assignable to type 'boolean'.: boolean = aBoolean maybe ;}
...Any型
状況によっては、すべての型情報が利用可能ではない場合や、型の宣言に過度の労力が必要になる場合があります。これらは、TypeScriptを使用せずに記述されたコードやサードパーティライブラリの値に対して発生する可能性があります。このような場合、型チェックをオプトアウトしたい場合があります。そのためには、これらの値にany
型を指定します。
tsTry
declare functiongetValue (key : string): any;// OK, return value of 'getValue' is not checkedconststr : string =getValue ("myString");
any
型は、既存のJavaScriptを操作するための強力な方法であり、コンパイル中に型チェックを段階的にオプトインおよびオプトアウトできます。
unknown
とは異なり、any
型の変数は、存在しないプロパティも含め、任意のプロパティにアクセスできます。これらのプロパティには関数が含まれており、TypeScriptはそれらの存在や型をチェックしません。
tsTry
letlooselyTyped : any = 4;// OK, ifItExists might exist at runtimelooselyTyped .ifItExists ();// OK, toFixed exists (but the compiler doesn't check)looselyTyped .toFixed ();letstrictlyTyped : unknown = 4;'strictlyTyped' is of type 'unknown'.18046'strictlyTyped' is of type 'unknown'.. strictlyTyped toFixed ();
any
は、オブジェクト全体に伝播し続けます。
tsTry
letlooselyTyped : any = {};letd =looselyTyped .a .b .c .d ;
結局のところ、any
のすべての利便性は、型安全性を失うという犠牲を払うことを忘れないでください。型安全性はTypeScriptを使用する主な動機のひとつであり、必要がない場合はany
の使用を避けるようにしてください。
...Void型
void
はany
の反対のようなものです。型がまったくないことを表します。これは、値を返さない関数の戻り値の型としてよく見られます。
tsTry
functionwarnUser (): void {console .log ("This is my warning message");}
void
型の変数を宣言することは役に立ちません。なぜなら、null
(strictNullChecks
が指定されていない場合のみ。次のセクションを参照)またはundefined
しか代入できないからです。
tsTry
letunusable : void =undefined ;// OK if `--strictNullChecks` is not givenunusable = null;
...NullとUndefined
TypeScriptでは、undefined
とnull
はそれぞれundefined
とnull
という名前の型を持ちます。void
と同様に、それら自体はそれほど役に立ちません。
tsTry
// Not much else we can assign to these variables!letu : undefined =undefined ;letn : null = null;
デフォルトでは、null
とundefined
は他のすべての型のサブタイプです。つまり、null
とundefined
をnumber
などに代入できます。
ただし、strictNullChecks
フラグを使用する場合、null
とundefined
はunknown
、any
、およびそれぞれの型(undefined
がvoid
にも代入できることを除く)にのみ代入できます。これは、多くの一般的なエラーを回避するのに役立ちます。string
またはnull
またはundefined
を渡したい場合は、共用体型string | null | undefined
を使用できます。
共用体型は、後の章で説明する高度なトピックです。
注意:可能な場合は
strictNullChecks
の使用を推奨しますが、このハンドブックでは、オフになっていると仮定します。
...Never型
never
型は、決して発生しない値の型を表します。たとえば、never
は、常に例外をスローするか、決して返らない関数式またはアロー関数式の戻り値の型です。変数は、決してtrueになることのない型ガードによって絞り込まれた場合にも、never
型を取得します。
never
型はすべての型のサブタイプであり、すべての型に代入できます。ただし、never
自体を除いて、どの型もnever
のサブタイプではなく、never
に代入できません。any
でさえnever
に代入できません。
never
を返す関数の例をいくつか示します。
tsTry
// Function returning never must not have a reachable end pointfunctionerror (message : string): never {throw newError (message );}// Inferred return type is neverfunctionfail () {returnerror ("Something failed");}// Function returning never must not have a reachable end pointfunctioninfiniteLoop (): never {while (true) {}}
...Object型
object
は、プリミティブ型ではない型、つまりnumber
、string
、boolean
、bigint
、symbol
、null
、またはundefined
ではないものを表す型です。
object
型を使用すると、Object.create
などのAPIをより適切に表現できます。例えば
tsTry
declare functioncreate (o : object | null): void;// OKcreate ({prop : 0 });create (null);Argument of type 'undefined' is not assignable to parameter of type 'object | null'.2345Argument of type 'undefined' is not assignable to parameter of type 'object | null'.create (); // with `--strictNullChecks` flag enabled, undefined is not a subtype of null undefined Argument of type 'number' is not assignable to parameter of type 'object'.2345Argument of type 'number' is not assignable to parameter of type 'object'.create (42 );Argument of type 'string' is not assignable to parameter of type 'object'.2345Argument of type 'string' is not assignable to parameter of type 'object'.create ("string" );Argument of type 'boolean' is not assignable to parameter of type 'object'.2345Argument of type 'boolean' is not assignable to parameter of type 'object'.create (false );
一般的に、これを使用する必要はありません。
...型アサーション
TypeScriptよりも値について多くの情報を知っている状況になることがあります。通常、これは、一部のエンティティの型が現在の型よりも具体的である可能性があることがわかっている場合に発生します。
_型アサーション_は、コンパイラに「私を信じてください、私は自分が何をしているかを知っています」と伝える方法です。型アサーションは、他の言語での型キャストのようなものですが、データの特別なチェックや再構築は行いません。実行時の影響はなく、純粋にコンパイラによって使用されます。TypeScriptは、プログラマーであるあなたが、必要な特別なチェックを実行したと想定しています。
型アサーションには2つの形式があります。
1つはas
構文です。
tsTry
letsomeValue : unknown = "this is a string";letstrLength : number = (someValue as string).length ;
もう1つのバージョンは「山括弧」構文です。
tsTry
letsomeValue : unknown = "this is a string";letstrLength : number = (<string>someValue ).length ;
2つのサンプルは同等です。どちらか一方を使用するかは、主に好みの問題です。ただし、JSXでTypeScriptを使用する場合は、as
スタイルのアサーションのみが許可されます。
...let
に関する注意
これまで、JavaScriptのvar
キーワードではなく、let
キーワードを使用してきたことに気づいたかもしれません。let
キーワードは、TypeScriptが利用可能にする新しいJavaScriptの構文です。ハンドブックリファレンスの変数宣言で、let
とconst
がvar
の問題の多くをどのように解決するかについて詳しく読むことができます。
...Number
、String
、Boolean
、Symbol
、およびObject
について
Number
、String
、Boolean
、Symbol
、またはObject
型が、上記で推奨されている小文字バージョンと同じであると考えるのは魅力的です。ただし、これらの型は言語プリミティブを参照しておらず、型として使用されることはほとんどありません。
tsTry
functionreverse (s :String ):String {returns .split ("").reverse ().join ("");}reverse ("hello world");
代わりに、number
、string
、boolean
、object
、およびsymbol
型を使用してください。
tsTry
functionreverse (s : string): string {returns .split ("").reverse ().join ("");}reverse ("hello world");