Javascript ES6 TypeError: конструктор класса Client не может быть вызван без 'new'

У меня есть класс, написанный на Javascript ES6. Когда я пытаюсь выполнить nodemon Команда Я всегда вижу эту ошибку TypeError: Class constructor Client cannot be invoked without 'new'

Полная ошибка упоминается ниже:

/Users/akshaysood/Blockchain/fabricSDK/dist/application/Transaction.js:45
        return (0, _possibleConstructorReturn3.default)(this, (FBClient.__proto__ || (0, _getPrototypeOf2.default)(FBClient)).call(this, props));
                                                                                                                              ^

TypeError: Class constructor Client cannot be invoked without 'new'
    at new FBClient (/Users/akshaysood/Blockchain/fabricSDK/dist/application/Transaction.js:45:127)
    at Object.<anonymous> (/Users/akshaysood/Blockchain/fabricSDK/dist/application/Transaction.js:195:14)
    at Module._compile (module.js:641:30)
    at Object.Module._extensions..js (module.js:652:10)
    at Module.load (module.js:560:32)
    at tryModuleLoad (module.js:503:12)
    at Function.Module._load (module.js:495:3)
    at Module.require (module.js:585:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/Users/akshaysood/Blockchain/fabricSDK/dist/routes/users.js:11:20)

Я пытаюсь создать класс, а затем создать экземпляр этого класса. Затем я пытаюсь экспортировать эту переменную.

Структура класса определяется ниже:

class FBClient extends FabricClient{

    constructor(props){
        super(props);
    }

<<< FUNCTIONS >>>

}

Как я пытаюсь экспортировать переменную ->

var client = new FBClient();
client.loadFromConfig(config);

export default client = client;

Вы можете найти полный код здесь> https://hastebin.com/kecacenita.js Код, сгенерированный Babel> https://hastebin.com/fabewecumo.js

11 ответов

Решение

Проблема в том, что этот класс расширяет родной класс ES6 и переносится на ES5 вместе с Babel. Транспортируемые классы не могут расширять нативные классы, по крайней мере без дополнительных мер.

class TranspiledFoo extends NativeBar {
  constructor() {
    super();
  }
}

приводит к чему-то вроде

function TranspiledFoo() {
  var _this = NativeBar.call(this);
  return _this;
}
// prototypically inherit from NativeBar 

Так как классы ES6 следует вызывать только с new, NativeBar.call приводит к ошибке.

Классы ES6 поддерживаются в любой последней версии Node, их нельзя переносить. es2015 следует исключить из конфигурации Babel, предпочтительно использовать env предустановка установлена ​​на node цель

Я транслировал не Javascript, а Typescript, и столкнулся с той же проблемой.

Я отредактировал конфигурационный файл компилятора Typescript, tsconfig.json, чтобы сгенерировать код Javascript ES2017:

{
    "compilerOptions": {
        "target": "ES2017",

вместо того, что по умолчанию, ES2015? - тогда все заработало.

(Возможно, этот ответ может быть полезен для людей, которые используют Typescript и находят этот вопрос, когда ищут такое же сообщение об ошибке, как и я.)

Для тех, кто использует ts-node, возможно, что вашtsconfig.jsonне может быть загружен ts-узлом.
Сначала убедитесь, что вы установили параметр ниже дляtsconfig.json:

{
    "compilerOptions": {
        "target": "ES6",
        ...
    }
}

Тогда вы можете попробовать ts-node --script-mode или используйте --project указать путь к вашему tsconfig.json.

В package.json вы можете использовать конфигурацию целей с @babel/preset-env. установитьesmodules как "правда".

Ниже приведен пример того, как я использую в своем файле:

  "babel": {
    "presets": [
      [
        "@babel/preset-env",
        {
          "targets": {
            "esmodules": true
          }
        }
      ],
      "@babel/preset-react",
      "@babel/preset-flow"
    ],
    "plugins": [
      "@babel/plugin-proposal-class-properties"
    ]
  },

Для Angular 9+ это может быть также связано с использованием флагов компиляции машинописного текста:

  • downlevelIteration
  • importHelpers

Подробнее здесьL https://www.typescriptlang.org/tsconfig#downlevelIteration.

Попробуйте использовать эти флаги в своем tsconfig.josn:

      {
    "compilerOptions": {
        ...
        "downlevelIteration": true,
        "importHelpers": true,
        ...
    }
}

Без "importHelpers": trueтоже должно работать.


Это решение в основном предназначено для Angular 9+ и компилятора ngcc — это была проблема, возникающая для Angular 11. Пользовательская конфигурация (пользовательская конфигурация ng-packgr — создание библиотеки Angular CLI было введено в Angular 6) для пакетов поддерживалась, так как был Angular 4+ в проекте. После переноса этих пакетов в библиотеки Angular 9+ (папка проектов) начала возникать ошибка. Я обнаружил, что эти флаги (строго downlevelIteration) решают именно проблему.

Если вы не используете babel и simple typescript. У меня ошибка в материале. Попробуйте уменьшить версии и привести их к похожим версиям. У моих пакетов было множество версий. Я решил проблему, снизив версии пакетов, таких как cdk, material.

Проверьте изображение моего последнего package.json

Проверьте свой массив "сущностей" в appmodule.ts. Я тоже это пропустил. Когда я сохранил имя объекта, которое используется в запросе, проблема была решена. Надеюсь, этот ответ поможет.

я использовал запись перед своим ObjectId в nextjs, и это сработало.

В моем случае это наблюдатель из «mobx-react-lite».

Решение состоит в том, чтобы понизить версию пакета.

npm удалить connect-mongo

npm я подключаюсь-монго @3

Надеюсь, вы уже смогли решить свою проблему, вот мое решение этой ошибки:

Цитата

class indexRoutes
{

    public  router: Router= Router();
}
const INDEX_ROUTES = new indexRoutes();
export default INDEX_ROUTES.router;
Другие вопросы по тегам