Skip to content

Instantly share code, notes, and snippets.

@dseg
Created December 17, 2016 10:30
Show Gist options
  • Save dseg/5bff134016352ea7072a48f1282a6f1e to your computer and use it in GitHub Desktop.
Save dseg/5bff134016352ea7072a48f1282a6f1e to your computer and use it in GitHub Desktop.
An ES6 Template Literal experiment
let tag = (strings, ...keys) => (...values) => {
//console.log(strings); // [ '', 'は', 'です。' ]
//console.log(keys); // [ 0, 1 ]
let dict = values[values.length - 1] || {};
let result = [strings[0]];
keys.forEach((key: any, i: number) => {
let value = Number.isInteger(key) ? values[key] : dict[key];
result.push(value, strings[i + 1]);
});
return result.join('');
};
// 1. 位置変数を定義して展開
let tmpl_func = tag`${0}は${1}です。`;
let res = tmpl_func('タイガーマスク', 'サンタクロース');
console.log('res1', res); //タイガーマスクはサンタクロースです。
// いきなり呼んでもOK
//tag`${0}は${1}です。`('タイガーマスク', 'サンタクロース');
// 2. 変数名を定義し、辞書を渡して展開
let dictionary={mask: 'タイガーマスク', role:'サンタクロース'};
tmpl_func = tag`${'mask'}は${'role'}です。`; // 変数名をシングルクオートで囲むのがポイント
res = tmpl_func(dictionary);
console.log('res2', res); //タイガーマスクはサンタクロースです。
// 3. 変数なし
tmpl_func = tag`引数なしメッセージです。`;
res = tmpl_func();
console.log('res3', res); // 引数なしメッセージです。
@dseg
Copy link
Author

dseg commented Dec 17, 2016

Run with

tsc -t es6 template-literal-1.ts|node

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment