Node.js 有没有办法防止将类传输到构造函数?

Node.js 有没有办法防止将类传输到构造函数?,node.js,ecmascript-6,babeljs,transpiler,Node.js,Ecmascript 6,Babeljs,Transpiler,我有一个node.js应用程序使用流。为了摆脱流语法,我使用了babel: { "presets": ["env", "flow"], "plugins": [ "transform-flow-strip-types" ] } 这是可行的,但问题在于使用“instanceof”操作符。我扩展了标准错误构造函数,如下所示: /* @flow */ class BadRequestError extends Error { constructor(

我有一个node.js应用程序使用流。为了摆脱流语法,我使用了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
};
class BadRequestError extends Error {
    constructor(message:string) {
    super(message);

        /* $FlowFixMe */
        this.constructor = BadRequestError;
        /* $FlowFixMe */
        this.__proto__ = BadRequestError.prototype;
    }
}
在Node.js中,它可以工作。但在传输之后,instanceof不再工作,因为类转换为构造函数

有什么办法可以预防吗

使用巴别塔-cli@6.26.0及node@8.9.0,这是我正在使用的命令行:

$ node_modules/.bin/babel ./src -d ./dist
作为国家

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

这就是ES6类被传输到常规函数的原因

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

为方便起见,您可以使用“node”:“current”仅包含运行Babel所用的node.js版本所需的多边形填充和变换

应该是:

{
    "presets": ["env", {
      "targets": {
        "node": "current"
      }
    }, "flow"],
    "plugins":  [
        "transform-flow-strip-types"
    ]
}
我用一根绳子把它修好了

  • 添加babel插件转换内置扩展
  • 将类更改为如下所示:

    /* @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
    };
    
    class BadRequestError extends Error {
        constructor(message:string) {
        super(message);
    
            /* $FlowFixMe */
            this.constructor = BadRequestError;
            /* $FlowFixMe */
            this.__proto__ = BadRequestError.prototype;
        }
    }
    

  • 请注意,接下来,它将在巴别塔7中修复

    谢谢你的回复,但这不是问题。我通过添加另一个插件和有人告诉我的技术进行了修复。很高兴你解决了它,但这才是真正的问题。因为您已经在使用
    env
    ,所以应该使用这种方法。它只用于应用特定环境中需要的转换。好的,谢谢。所以我只是将目标env更改为node:6.9.5,这是我真正的目标平台使用的,但巴贝尔仍然将类转换为构造函数。后跟此站点:,节点支持v4.9.1中的类。为什么会发生这种情况?@modernator是的,从4.0开始支持类。我无法复制这一点。我指定了
    “节点”:“6.9.5”
    ,其行为方式与
    “节点”:“当前”
    相同,即不传输类。它是巴贝尔CLI 6.18.0和巴贝尔预设环境1.6.1。最新的巴别塔6也一样,