Не удается скомпилировать ts-файлы с помощью gulp при таргетинге на es5

#angular #typescript #npm #gulp #gulp-typescript

#angular #typescript #npm #gulp #gulp-typescript

Вопрос:

Я запустил свое первое приложение Angular2 и не могу использовать gulp для компиляции для es5.

Вот файл зависимостей:

 "dependencies": {
    "@angular/common": "2.0.0",
    "@angular/compiler": "2.0.0",
    "@angular/compiler-cli": "0.6.0",
    "@angular/core": "2.0.0",
    "@angular/forms": "2.0.0",
    "@angular/http": "2.0.0",
    "@angular/platform-browser": "2.0.0",
    "@angular/platform-browser-dynamic": "2.0.0",
    "@angular/router": "3.0.0",
    "@angular/upgrade": "2.0.0",
    "angular2-in-memory-web-api": "0.0.18",
    "bootstrap": "^3.3.6",
    "core-js": "^2.4.1",
    "gulp": "^3.9.1",
    "gulp-htmlmin": "^2.0.0",
    "gulp-rename": "^1.2.2",
    "jquery": "^2.2.0",
    "moment": "^2.14.1",
    "ng2-accordion": "0.0.9",
    "ng2-bootstrap": "^1.1.5",
    "reflect-metadata": "^0.1.3",
    "responsive-directives-angular2": "^0.4.2",
    "rxjs": "5.0.0-beta.11",
    "systemjs": "0.19.27",
    "zone.js": "^0.6.17"
  },
  "devDependencies": {
    "@types/core-js": "^0.9.34",
    "@types/node": "^6.0.41",
    "browser-sync": "^2.16.0",
    "canonical-path": "0.0.2",
    "chai": "^3.5.0",
    "concurrently": "^2.2.0",
    "del": "^2.2.2",
    "gulp": "^3.9.1",
    "gulp-htmlmin": "^2.0.0",
    "gulp-rename": "^1.2.2",
    "gulp-sass": "^2.3.2",
    "gulp-sourcemaps": "^1.6.0",
    "gulp-tslint": "^6.1.1",
    "gulp-typescript": "^2.14.0",
    "http-server": "^0.9.0",
    "jasmine-core": "~2.4.1",
    "karma": "^1.2.0",
    "karma-chai": "^0.1.0",
    "karma-chrome-launcher": "^0.2.3",
    "karma-cli": "^0.1.2",
    "karma-htmlfile-reporter": "^0.2.2",
    "karma-jasmine": "^0.3.8",
    "karma-mocha": "^1.1.1",
    "lite-server": "^2.2.2",
    "lodash": "^4.11.1",
    "mocha": "^3.0.2",
    "node-sass": "^3.10.0",
    "raw-loader": "^0.5.1",
    "rimraf": "^2.5.2",
    "sass-loader": "^4.0.2",
    "tslint": "^3.7.4",
    "typescript": "^2.0.3",
    "typings": "^1.3.2",
    "webpack": "^1.13.2",
    "webpack-dev-server": "^1.14.1",
    "webpack-merge": "^0.14.0"
  }
  

У меня есть следующий tsconfig.json

 {
  "compilerOptions": {
    "declaration": false,
    "outDir": "dist/app",
    "target": "es5",
    "mapRoot": "./",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false,
    "suppressImplicitAnyIndexErrors": true
  },
  "exclude": [
    "node_modules"
  ],
  "filesGlob": [
    "./**/*.ts",
    "!./node_modules"
  ]
}
  

Если я скомпилирую приложение с помощью команды tsc, все кажется идеальным. У меня могут быть файлы моего приложения в dist / app.

Я хочу использовать gulp для автоматизации многих вещей, поэтому у меня есть следующий файл gulp :

 var gulp = require('gulp');
const typescript = require('gulp-typescript');
var tsProject = typescript.createProject('tsconfig.json');
const sourcemaps = require('gulp-sourcemaps');

// TypeScript compile
gulp.task('compile', function () {
  return gulp
    .src(['./app/**/*.ts'])
        .pipe(sourcemaps.init())
    .pipe(typescript(tsProject))
        .pipe(sourcemaps.write('.'))
    .pipe(gulp.dest('dist/app'));
});
  

Когда я запускаю компиляцию gulp, у меня много ошибок, таких как :

 /home/user/workspace/projects/node_modules/rxjs/operator/toPromise.d.ts(10,36): error TS2304: Cannot find name 'Promise'
/home/user/workspace/projects/node_modules/rxjs/operator/toPromise.d.ts(10,36): error TS2304: Cannot find name 'Set'
/home/user/workspace/projects/node_modules/rxjs/operator/toPromise.d.ts(10,36): error TS2304: Cannot find name 'Map'
  

Похоже, что gulp-typescript не может использовать синтаксис ES6 при таргетинге на ES5.

Если я изменю цель на es6 в tsconfig.json, все будет работать. Но, конечно, мне нужен вывод, который работает с относительно старыми браузерами.

Я нашел много предложений, которые я пробовал, например, добавить несколько ссылок в основной ts-файл, но ничего не работает.

Комментарии:

1. На самом деле, кажется, что, несмотря на ошибки, приложение работает. Я не могу понять, что здесь действительно произошло.

2. Похоже, что он просто не знает об определениях типов. Если вы используете TypeScript 2, добавьте "typeRoots": ["node_modules/@types"] в раздел параметров компилятора файл tsconfig и посмотрите, может ли он разрешить типы при компиляции.

Ответ №1:

Это была проблема с версией gulp-typescript, которая была :

 "gulp-typescript": "^2.14.0",
  

Я не знаю, как работает этот пакет, но похоже, что он использует не установленный в данный момент пакет typescript, а его собственную версию.

Когда я обновляю версию, все работает нормально.

 "gulp-typescript": "^3.0.2",