string - TypeScriptキーワード一覧
スポンサーリンク
「string」は基本型(プリミティブ型)の1つである「文字列型」として用いられます。
概要
(特筆の無いものは TypeScript/spec.md 「3.2.3 The String Type」での定義によります。)
- (型としての)キーワード「string」(または「string 型」)は『Stringプリミティブ型』を表します。
- 『Stringプリミティブ型』(以下「string 型」)は16ビットの符号なし整数を0個から「253-1」個まで持つ順列の値を表す型であり、各要素はUnicodeのUTF-16表現の文字コードとして扱われます。(ES2015 の仕様)
"abc"
や'def'
などの「文字(列)リテラル」データを string 型の変数への書き込みとして利用できます。`value = ${val}`
などの「テンプレートリテラル」(タグ付きを除く)は、その(評価の)結果が string 型の値として扱われます。(ES2015 の仕様)- 「文字列リテラル」を「型」として扱った場合は、それらは string 型の部分型(subtype)として扱われ、string 型のデータに代入することができます。(TypeScript PR #9407)
- string 型は(型としては)グローバルにあるインターフェイス「String」型と同じプロパティーを持つオブジェクト型として扱われます。
- 値としては、内部処理「ToObject」が行われたときに「String」のオブジェクトとして変換されます。(ES2015 の仕様)
- 式の結果が string 型の値であった場合、その式に対する
typeof
の結果は"string"
となります。(ES2015 の仕様)typeof x === "string"
という構文を用いると、その条件(型ガード; type guard)下で実行されるコードにおいて x が string 型として扱われるようになります。(「4.24 Type Guards」)
キーワード情報
- 「string」は識別子としては予約されていません。(ユーザー定義の識別子として利用できます。)
- 「string」は型名として予約されています。(ユーザー定義の型名として利用できません。)
詳細
string 型はプログラム上で「文字列」を扱う基本的な型として利用されます。HTML要素のテキストや console.log
でのコンソール出力などユーザーが視覚的に理解しやすい内容を出力する際に用いられます。
let x: string; // string 型変数
x = "world"; // 文字列リテラルのデータは string 型として扱われるので string 型変数に代入可能
x = 'hello ' + x; // string 型同士の「+」演算の結果は string 型
let y: 'bar' = 'bar'; // 文字列リテラル「'bar'」は型として使え、string 型変数としても扱える
let z = y.substr(0, 2); // 「String」型のプロパティー(メソッド)が使用できる
let c = x[4]; // string 型が暗黙的に「String」型になり、インデックス「4」の値が得られる
// (意味的には 0 ベースの 4 文字目となる)
// ※ 「String」型の中に「readonly [index: number]: string;」という定義がある
let len = `${z}th`.length; // 通常のテンプレートリテラルの結果は string 型扱い
なお、string 型はグローバルの「String」型として扱うことは出来ますが、「String」型の変数に string 型データを代入しても実体は「String」オブジェクトのデータではなくあくまで string 型データであるため、「instanceof String」で検出することは出来ません。そのため、特別な理由が無い限りは「String」型やそのオブジェクトを利用するのではなく string 型を利用するのが推奨されます。(関数としての「String」の利用や、「String」自身に存在するプロパティー(スタティックフィールド)を利用するのは問題ありません。)
let p = String('tako'); // 「String 関数」の戻り値は string 型
let q = new String('yaki');// 「String」オブジェクトの作成(「String」型)
let r = p + q; // 内部的に「toString」同等の処理が呼び出されるので string 型同士の「+」が行われ「takoyaki」になる
let s: String | null; // 「String」型または null 型として定義(strictNullChecksが有効の場合)
if (process.env.NODE_ENV === 'DEVELOPMENT') {
s = 'Debug';
} else {
s = null;
}
// 「String」型かどうかのチェック
if (s instanceof String) {
// (型解析上は s は String になるが実際にはここに入らない)
console.log('String', s);
} else {
// (型解析上は s は null になるが実際には文字列である場合もここに入る)
console.log('null', s);
}
string 型かどうかは typeof x === "string"
でチェックできます。また、この式は以下のように型ガード(type guard)としても利用できます。
let unk: any; // 型が不明な変数
.
.
.
if (typeof unk === 'string') {
// このブロックでは unk を string 型の変数として扱える
console.log(unk.toUpperCase());
}
※ 「String」型は内部的にはオブジェクトであるため、x が「String」型であるとき typeof x === "string"
は false になります。