有没有办法阻止转换Class到构造函数?

时间:2018-04-02 14:50:00

标签: node.js ecmascript-6 babel transpiler

我有一个node.js应用程序使用Flow。为了摆脱Flow语法,我使用了babel:

{
    "presets": ["env", "flow"],
    "plugins":  [
        "transform-flow-strip-types"
    ]
}

它有效,但问题是使用" instanceof"运营商。我像这样扩展了标准错误构造函数:

/* @flow */
class BadRequestError extends Error {
    constructor(message:string) {
        super(message);
    }
}

class InvalidRequestBodyError extends Error {
    constructor(message:string) {
        super(message);
    }
}

class UnauthorizedError extends Error {
    constructor(message:string) {
        super(message);
    }
}

class ExpiredResourceError extends Error {
    constructor(message:string) {
        super(message);
    }
}

class InternalServerError extends Error {
    constructor(message:string) {
        super(message);
    }
}

class ResourceNotFoundError extends Error {
    constructor(message:string) {
        super(message);
    }
}

module.exports = {
    BadRequestError,
    InvalidRequestBodyError,
    UnauthorizedError,
    ExpiredResourceError,
    InternalServerError,
    ResourceNotFoundError
};

在Node.js中,它可以工作。但经过编译后,instanceof不再起作用了,因为类转换为了构造函数。

有没有办法阻止它?

使用babel-cli@6.26.0和node@8.9.0,这是我使用的命令行:

$ node_modules/.bin/babel ./src -d ./dist

2 个答案:

答案 0 :(得分:1)

Babel preset-env documentation所述,

  

没有任何配置选项,babel-preset-env的行为与babel-preset-latest(或babel-preset-es2015,babel-preset-es2016和babel-preset-es2017)完全相同。

这就是为什么ES6类被转换为常规函数的原因。

此页面包含有关在节点中使用此预设的所有信息:

  

为方便起见,您可以使用“node”:“current”仅包含用于运行Babel的Node.js版本所需的polyfill和转换

应该是:

{
    "presets": ["env", {
      "targets": {
        "node": "current"
      }
    }, "flow"],
    "plugins":  [
        "transform-flow-strip-types"
    ]
}

答案 1 :(得分:0)

我通过

解决了这个问题
  1. 添加babel-plugin-transform-b​​uiltin-extend
  2. 更改类如下:

    CREATE TABLE IF NOT EXISTS p1929_salesreport (id INTEGER PRIMARY KEY AUTO_INCREMENT, 
                              company_id INTEGER,
                             company_code INTEGER,
                             value INTEGER);
    
    INSERT INTO p1929_salesreport (company_id, company_code, value) VALUES (0, 67, 100);
    INSERT INTO p1929_salesreport (company_id, company_code, value) VALUES (0, 55, 200);
    
    CREATE TABLE IF NOT EXISTS p1929_company (id INTEGER PRIMARY KEY AUTO_INCREMENT,
                         company_code INTEGER,
                         name TEXT);
    
    INSERT INTO p1929_company (company_code, name) VALUES (55, "XX");
    INSERT INTO p1929_company (company_code, name) VALUES (67, "XA");
    
    /* before changes */
    SELECT * FROM p1929_company;
    SELECT * FROM p1929_salesreport;
    
    /* actual query */
    UPDATE p1929_salesreport
    LEFT JOIN p1929_company ON p1929_company.company_code = p1929_salesreport.company_code
    SET p1929_salesreport.company_id = p1929_company.id;
    
    /* after changes */
    SELECT * FROM p1929_salesreport;
    
    DROP TABLE p1929_salesreport;
    DROP TABLE p1929_company;
    
  3. 请注意,按this后,它将在Ba​​bel 7中修复!