Menu

TypeScriptの文字列: 埋め込み・複数行・含むか判定

TypeScriptで文字列を扱う方法。テンプレートリテラルでの変数の埋め込み、複数行の文字列、部分文字列を含むかどうかの判定、よく使うメソッドとその戻り値の型、文字列リテラル型を解説します。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

TypeScriptの文字列は、string 型を持つJavaScriptの文字列です。変数を埋め込むにはテンプレートリテラルを使います。バッククォートで囲み、${expression} のプレースホルダーを書きます。シングルクォートとダブルクォートは埋め込みのない普通の文字列になります。

3種類の引用符はどれも同じ string 型になります。$${...} の最初の $ はただのドル記号で、プレースホルダーを始めるのは ${ だけです。

文字列への埋め込み

${ } の中には、変数、計算、関数呼び出し、三項演算子、入れ子のテンプレートリテラルを書けます。値は String(value) と同じ方法で文字列に変換されます(例外は symbol で、埋め込むとコンパイルエラー TS2731 になり、実行時には TypeError を投げます。String(sym) と書いてください)。

オブジェクトを埋め込むと [object Object] と出力されますが、これはまず望んだ結果ではありません。フィールドを選ぶか、JSON.stringify(obj) を使います。

複数行の文字列

テンプレートリテラルは複数行にまたがって書けます。バッククォートの間はすべて文字列の一部なので、改行も各行の先頭のインデントも残ります。

コードのインデントが文字列に入ってしまう場合は、配列と join("\n") で組み立てるか、テンプレートリテラルの各行を行頭にそろえて書きます。

文字列が部分文字列を含むか判定する

includes は「含むかどうか」を boolean で返します。startsWith と endsWith は先頭と末尾を調べます。indexOf は位置を返し、部分文字列がなければ -1 を返します。どれも大文字と小文字を区別します。

includes は開始位置も受け取ります: file.includes("R", 1) はインデックス1から探します。

よく使うメソッドとその型

TypeScriptは組み込みメソッドすべての戻り値の型を知っています。注意すべきなのは空の結果を返しうるメソッドです。strict のもとでは、結果を使う前に null や undefined を処理しなければなりません。

メソッド戻り値例
includes, startsWith, endsWithboolean"abc".includes("b") は true
indexOf, lastIndexOfnumber(ない場合は -1)"abc".indexOf("c") は 2
slice, substringstring"hello".slice(1, 3) は "el"
splitstring[]"a,b".split(",") は ["a", "b"]
trim, trimStart, trimEndstring" x ".trim() は "x"
toUpperCase, toLowerCasestring"Ts".toUpperCase() は "TS"
padStart, padEndstring"7".padStart(3, "0") は "007"
replace, replaceAllstring"a-b-c".replaceAll("-", "") は "abc"
repeatstring"ab".repeat(2) は "abab"
atstring | undefined"abc".at(-1) は "c"
matchRegExpMatchArray | null"a1".match(/\d/)
length(プロパティ)number"abc".length は 3

s[5] のような普通のインデックスアクセスは、インデックスが末尾を超えていても(実行時の値は undefined)型は string です。コンパイラーオプション noUncheckedIndexedAccess を有効にすると string | undefined になります。

文字列はイミュータブル

文字をその場で変更することはできません。TypeScriptはインデックスへの代入をエラー TS2542 Index signature in type 'String' only permits reading. として報告し、コンパイル後の strict モードのJavaScriptでも、同じ代入は実行時に TypeError を投げます。文字列を変更しているように見えるメソッドはすべて新しい文字列を返します。

ほかの値を文字列に、または文字列を数値に変換する方法は 文字列から数値への変換 を参照してください。

文字列リテラル型

string はどんなテキストも受け付けます。文字列リテラル型はひとつの値だけを受け付け、そのユニオンで enum のような許可された文字列の集合を作れます:

リテラル型はコンパイル時にだけチェックされます。実行時には label("deleted") もそのまま動いて Post is deleted と出力され、ここでの2行目はまさにそうなります。テンプレートリテラルの構文は型のレベルでも使えます。type EventName = `on${string}` は on で始まる任意の文字列を受け付けます。

よくある質問

TypeScriptで文字列に変数を埋め込むには?

テンプレートリテラルを使います。バッククォートで囲み、`Hello, ${name}!` のように ${expression} のプレースホルダーを書きます。波かっこの中にはどんな式でも書けて、結果の型は string です。シングルクォートやダブルクォートでは埋め込みはできません。

TypeScriptで複数行の文字列を書くには?

テキストをバッククォートで囲み、ソース上で改行します。テンプレートリテラルは改行も各行の先頭のインデントもそのまま保ちます。ほかには、行の配列を .join("\n") で結合するか、普通の文字列の中で \n を使う方法があります。

TypeScriptで文字列が部分文字列を含むか判定するには?

text.includes("part") を呼ぶと boolean が返ります。大文字と小文字を区別するので、区別せずに判定するには小文字にそろえて比較します: text.toLowerCase().includes(part.toLowerCase())。先頭と末尾は startsWith と endsWith で調べ、indexOf は位置か -1 を返します。

TypeScriptとJavaScriptで文字列に違いはありますか?

ありません。実行時には同じメソッドを持つ同じJavaScriptの文字列です。TypeScriptは string 型を加え、存在するメソッドを呼んでいるかをチェックし、戻り値の型を知っています。たとえば match は null を、at は undefined を返すことがあります。

TypeScriptの文字列の1文字を変更できますか?

できません。文字列はイミュータブルで、s[0] = "H" はコンパイルエラー TS2542(Index signature in type 'String' only permits reading)になります。代わりに新しい文字列を作ります: "H" + s.slice(1)。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める