58
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

タグ付きテンプレートリテラルを理解したい

Last updated at Posted at 2022-06-02

はじめに

MDNによると、

テンプレートリテラルは非公式にテンプレート文字列と呼ばれることもありますが、文字列リテラルではないので、文字列リテラルが使えるところならばどこでも使えるわけではありません。

恥ずかしながら、文字列リテラルだと思ってました。
MDNを読んでいると日々新しい発見があって面白いです。

テンプレートリテラルのおさらい

文字列リテラルは、シングルクォートとダブルクォートで文字列を囲みますが、
テンプレートリテラルは、バッククォートで囲みます。

通常の文字列リテラルと違うのは主に2点。

1.改行できる。
2.プレースホルダーを含めることができる。

改行について

// 文字列リテラル
const hoge: string = "Hello, \nworld!";
console.log(hoge);

// テンプレートリテラル
const fuga: string = `Hello, 
world!`;
console.log(fuga);

結果

Hello,
world!
Hello,
world!

文字列リテラルの場合は、エスケープ記法を用いることで改行していましたが、
テンプレートリテラルはリテラル中で改行可能です。

余談ですが、
テンプレートリテラルでエスケープ記法を用いても結果は同じです。

const fuga: string = `Hello, \nworld!`;
console.log(fuga);
Hello,
world!

プレースホルダーを含める

文字列の中にドル記号と波括弧で囲んで値や式を記載できます。

const a: number = 2;
const b: number = 3;

// 文字列リテラル
const hoge: string = "2+3=" + (a + b) + "\nです。";
console.log(hoge);

// テンプレートリテラル
const fuga: string = `2+3=${a + b}
です。`;
console.log(fuga);

結果

2+3=5
です。
2+3=5
です。

シンタックスシュガーとして使えます。

タグ付きテンプレートとは

タグ付きテンプレートは、テンプレートリテラルのより高度な形式です。
タグを使用すると、テンプレートリテラルを関数で解析できます。タグ関数の最初の引数には、文字列リテラルの配列を含みます。残りの引数は式に関連付けられます。
タグ関数は、これらの引数に対して何でも望み通りの操作を実行することができ、加工された文字列を返します。(または、以下の例の一つで示しているように、まったく異なるものを返すこともできます。)
タグに使用される関数の名前は、自由に指定できます。

つまりテンプレートリテラルの前にタグの関数を置き、
値の前処理を行うことができるということです。

ちょっと試してみます。

function setUser(strings :TemplateStringsArray, id: number) {
    let userName: string = "ゲスト";
    switch (id) {
        case 1:
            userName = "島尻";
            break;
        case 2:
            userName = "山田";
            break;
        case 3:
            userName = "田中";
            break;
        default:
            break;
    }
    return `${strings[0]}${userName}${strings[1]}`;
}

const userId: number = 1;
const result: string = setUser`こんにちは${userId}さん`;

console.log(result); // -> こんにちは島尻さん

第一引数のTemplateStringsArrayは、テンプレートリテラルの固定の文字部分を区切った配列となります。
この場合だと、以下のような中身になります。

[ 'こんにちは', 'さん' ]

そして第二引数で受け取ったuserIdでuserNameを判断し、
引数として受け取ったTemplateStringsArrayの値と、
userNameをテンプレートリテラルで組み立ててreturnしています。

まとめ

先に結論は出てしまっていますが、テンプレートリテラル前のタグ関数で、
値の前処理を行えるというものでした。

タグ付きテンプレートリテラルは、使いどころも結構限定されるかと思うので、
こんなことができるぐらいで覚えておくと良いかもしれません。

参考

58
44
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
58
44

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?