ES6模板文字:如何在解释范围之前传递范围?

时间:2016-10-25 08:44:59

标签: javascript node.js ecmascript-6

我开始使用模板文字来制作错误生成器。

我有工作代码,但我被迫在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')}}", 的那个,而是模块中的那个。

3 个答案:

答案 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 answerthis