タグ付きテンプレート関数は、コンストラクター関数が通常の関数ではないのと同じように、通常の関数ではありません。特別な方法以外で呼び出すべきではありません。new
補間された文字列リテラルを使用するタグ付け関数を持つコンストラクター。
コンストラクターは Pascal Case でなければならないという規則があるため、コンストラクターであることが呼び出し元には明らかです。
- 関数のタグ付けに同様の規則はありますか?
- そうでない場合、末尾にアンダースコアを付けることを強制することは、他の規則にとってあいまいになりますか?
function tagger_(s, name, food) {
return `${s[0]}${name}${s[1]}${food}${s[2]}`
}
const name = 'Dave';
const food = 'ice-cream'
const message = tagger_`Hello World! My name is ${name} and I like ${food} for dinner`;
console.log(message);
これが通常の関数ではない理由は、最初の引数が文字列ではないことです。
const log = console.log;
function tagger_(s) {
console.log(`Has raw property: ${!!s.raw}`);
}
tagger_(`Hello World!`);
tagger_`Hello World!`
同様に、s.raw
プロパティにはエスケープされていない文字列が含まれています。これを偽装する実際的な方法はありません。できたとしても、それは非常に悪い習慣です。
function tagger_(s) {
console.log(`s.raw: ${s.raw}`);
}
tagger_`This\nhas\tspecial characters`
ダックタイピング問題
ダック型のオブジェクトを作成してメソッドに渡してすぐに失敗しないようにすることは可能かもしれませんが、engune によって生成されたオブジェクトのインターフェイスが拡張される可能性があります (たとえば、escapedRaw
プロパティが追加される可能性があります)。これは、通常の関数としてメソッドを呼び出すものはすべて壊れることを意味します。
s
通常の関数を完全に制御できるように書くと、関数の場合、パラメーターの型はライターによって制御されないため、ここではそうではありません。