"Для этого синтаксиса требуется импортированный помощник, но модуль" tslib "не может быть найден" с модулями ES2015

У меня есть демонстрационный проект, который я собираюсь скомпилировать для ES5 с включенными модулями tslib и tslib используемыми для внешних помощников TS:

package.json

{
  "name": "foo",
  "scripts": {
    "build": "tsc"
  },
  "dependencies": {
    "tslib": "^1.9.3"
  },
  "devDependencies": {
    "typescript": "^3.1.3"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "es2015",
    "outDir": "./lib",
    "rootDir": "./src",
    "importHelpers": true,
    "strict": true,
    "experimentalDecorators": true
  }
}

SRC/index.ts

function a(target: any) {
    return target;
}

@a
export class Foo {}

Это приводит к ошибке:

src/index.ts: 5: 1 - ошибка TS2354: для этого синтаксиса требуется импортированный помощник, но модуль tslib не может быть найден.

Хотя lib/index.js правильно скомпилирован:

import * as tslib_1 from "tslib";
function a(target) {
    return target;
}
var Foo = /** @class */ (function () {
    function Foo() {
    }
    Foo = tslib_1.__decorate([
        a
    ], Foo);
    return Foo;
}());
export { Foo };

Как решить эту проблему?

Ответ 1

Ошибка Нуба (которую я только что сделал). Пытаться:

npm install tslib

или же

npm i

Лично перед git clean -fxd в пятницу я сделал git clean -fxd, но не npm i поэтому все npm-пакеты отсутствовали. Doh!

Ответ 2

Только что обновил tslib до последней версии, и проблема была исправлена. Я установил 1.9.3 и обновил до 1.10.0.

Ответ 3

В качестве опорных состояний разрешение модуля устанавливается в режим узла только для "modules": "commonjs" и устанавливается в классический режим для "modules": "es2015":

Существуют две возможные стратегии разрешения модулей: Node и Classic. Вы можете использовать флаг --moduleResolution, чтобы указать стратегию разрешения модуля. Если не указано, по умолчанию используется значение Classic для --module AMD | Система | ES2015 или узел в противном случае

Поскольку классический режим не знает о node_modules, компилятор не может разрешить модуль tslib.

moduleResolution должен быть установлен явно для модулей ES2015:

...
"module": "es2015",
"moduleResolution": "node",
...

Ответ 4

Я получаю эту ошибку. Это усугублялось, когда я устанавливал Angular Material.

Поэтому я обновил CLI и Core до последних версий и все еще получил ошибку.

Но я понял проблему, так как новый CLI "ng new projectname" добавляет дубликаты узлов:

"module": "esnext",
"moduleResolution": "node",

в tsconfig.json

Удалил дубликаты и установил Angular Material 8.0.1 без ошибок.

Ответ 5

Добавьте эту строку ниже в ваш файл .csproj внутри <PropertyGroup>:

<TypeScriptCompileBlocked>True</TypeScriptCompileBlocked>

Ответ 6

обновите зависимости и devDependencies tslib в package.json

{
   dependencies:{
     "tslib": "1.10.0",
   },
   devDependencies:{
     "tslib": "1.10.0",
   }
}