рекомендуемая конфигурация скриптов для узла 8

Каков рекомендуемый конфиг для машинописного текста, если я хочу использовать скомпилированные источники с узлом 8?

В большинстве руководств используется следующий tsconig.json:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs"
  }
}

Но теперь я понял, что не все доступные функции поддерживаются. Например, ['foo'].includes('bar') выдает ошибку: свойство 'includes' не существует в типе 'string []'.

Я нашел проблему, которая решает эту проблему. Решение заключается в использовании lib es7. Я мог бы перезаписать libs по умолчанию: "lib": ["es7"]

Но я не уверен, что это лучший вариант для узла 8 - есть ли еще функции, которые не поддерживаются этой библиотекой? есть ли определенные функции?

Поэтому мой вопрос: каковы наилучшие конфигурации для target, lib и module если я хочу использовать узел 8?

Ответ 1

Начиная с Node.js 8.10.0 100% ES2017. Если вы знаете, что используете таргетинг на эту версию или новее, оптимальная конфигурация будет выглядеть так:

  • "module": "commonjs"

    Node.js по-своему добавляет ES-модули, но пока нам придется придерживаться CommonJS.

  • "target": "es2017"

    Это говорит TypeScript, что это нормально выводить синтаксис JavaScript с функциями из ES2017. На практике это означает, что он будет, например, выход async/await вместо встраивания polyfill (__awaiter).

  • "lib": ["es2017"]

    Это говорит TypeScript, что можно использовать функции и свойства, введенные в ES2017 или ранее. На практике это означает, что вы можете использовать, например, Array.prototype.includes и String.prototype.padStart.

Таким образом, полная конфигурация будет:

{
  "compilerOptions": {
    "lib": ["es2017"],
    "module": "commonjs",
    "target": "es2017"
  }
}

Ответ 2

Я уверен, что вы уже нашли это, но здесь есть шаблон стартера Microsoft: https://github.com/Microsoft/TypeScript-Node-Starter

Пока вы все еще находитесь на узле 8.x, держите свой module в commonjs, target может быть es6.

compilerOptions.lib только определяет, какие объявления компилятор использует для проверки времени компиляции, это не влияет на вывод tsc. Другими словами, вы можете использовать любую lib которую хотите, и не беспокоиться о том, что ваш transpiled-код будет другим (это полностью контролируется compilerOptions.target).

Использование es7 как lib в вашем случае будет в порядке и даст вам объявления типа для ES7 и ниже.

Array.includes - ES7 (ES2016), и поэтому, как вы обнаружили, это не часть ES6. Вы можете определить свой lib как; lib: ["es6", "ES2016.Array.Include"] чтобы обойти вашу проблему.