假设有一个像这样的对象table
(表示数据库表结构):
table = { name: "Some table", code: "SOME_TABLE",
columns: [
{ name : "Identifier", code: "ID", typ: "number" },
{ name : "Description", code: "DESCR", typ: "varchar2", length: 255 },
]
}
是否有一种模式如何编写替换函数,允许在标记模板文字中插入table.columns
数组?
像
这样的东西function sqlCreate ( strings, ...values ) {
... do something very smart ...
}
并使用它:
sqlCreate`create table ${table.code} ( ...something...${table.columns}...inner template...${'.code'} ${'.typ'}...end of inner template )`
其中${'.code'}
和${'.type'}
会以某种方式引用table.column
数组中对象的属性。
我试图搞清楚,但它似乎没有多大意义,而应该有一个专门的生成器功能,它会做正确的事情。
您是否意识到任何成功尝试解决此问题的纯模板解决方案"?
答案 0 :(得分:1)
您需要一些方法来分隔内部模板。您可以创建自己的语法来指示它的开始和结束位置,或者您可以使用已存在的语法 - 您可以在${}
内部使用内部模板字符串。
对于像您的示例一样简单的事情,您甚至不需要自定义标记功能:
`create table ${table.code} (${table.columns.map(col =>`${col.code} ${col.typ}`).join(', ')})`
注意:因为模板字符串中的${}
总是立即被评估,所以您必须在某些回调函数代码中嵌入内部模板以延迟评估。或者你必须采用“模板引擎”的方式。