我开始使用模板文字来制作错误生成器。
我有工作代码,但我被迫在constructor
范围内声明可能的错误列表,我对此并不满意。
有没有办法复制模板文字而不进行评估,以便我可以在正确的范围内对其进行评估?或者将范围传递给模板文字?
工作error.js
:
'use strict';
class Error {
constructor(code) {
const error = {
//...
//API
1001: 'No token',
1002: `${arguments[1]}`,
1003: `${arguments[1]} ! ${arguments[2]}`,
1004: 'Missing data'
//...
};
let i = 0;
this.code = code;
this.error = error[code];
//...
}
}
// export default Error;
module.exports = Error;
叫做:
'use strict';
const Error = require('./error.js');
console.log(new Error(1002, 'var'));
我希望能够在模块范围内声明const error
,或者更好的是,在我require
的文件中声明argument
。但是现在这样做导致constructor
不是 url:"{{url('/admin/settings/addcollege')}}",
的那个,而是模块中的那个。
答案 0 :(得分:5)
立即评估字符串文字。它们不能用作以后格式化的模板(不像Python的格式字符串看起来类似)。
你可以做Leonid Beschastny建议的事情,并使用很少的函数来为你做插值。
这样的事情:
const error = {
1001: () => 'No token',
1002: (args) => `${args[1]}`,
1003: (args) => `${args[1]} ! ${args[2]}`,
1004: () => 'Missing data'
};
this.error = error[code](arguments);
答案 1 :(得分:1)
模板文字不是更灵活,这是一种耻辱。
以下两种方法可能与您想要的方法相近。
var s = (item, price) => {return `item: ${item}, price: $${price}`}
s('pants', 10) // 'item: pants, price: $10'
s('shirts', 15) // 'item: shirts, price: $15'
概括:
var s = (<variable names you want>) => {return `<template with those variables>`}
如果您没有运行E6,您也可以这样做:
var s = function(<variable names you want>){return `<template with those variables>`}
这似乎比以前的答案更简洁。
https://repl.it/@abalter/reusable-JS-template-literal
class Person
{
constructor (first, last)
{
this.first = first;
this.last = last;
}
sayName ()
{
return `Hi my name is ${this.first} ${this.last}`;
}
}
var bob = new Person("Bob", "Jones")
console.log(bob.sayName()) // Hi my name is Bob Jones
console.log(new Person("Mary", "Smith").sayName()) // Hi my name is Mary Smith
https://repl.it/@abalter/late-evaluation-of-js-template-literal
答案 2 :(得分:0)
我通过范围的首选解决方案是使用此包装器:
function defer([fisrt, ...rest]) {
return (...values) => rest.reduce((acc, str, i) => acc + values[i] + str, fisrt);
}
仅此而已。当我想重用模板并推迟替换的分辨率时,我只是这样做:
> t = defer`My template is: ${null} and ${null}`;
> t('simple', 'reusable'); // 'My template is: simple and reusable'
> t('obvious', 'late to the party'; // 'My template is: obvious and late to the party'
> t(null); // 'My template is: null and undefined'
>
> defer`Choose: ${'ignore'} / ${undefined}`(true, false); // 'Choose: true / false'
应用此标记将返回一个'function'
(而不是'string'
),该参数将忽略传递给文字的任何参数。然后可以使用新参数调用它。如果参数没有相应的替换,它将变为'undefined'
。
您可以在其他答案中找到更多信息:this answer和this。