Spec-Zone.ru › Node.js 22 LTS

Модули: TypeScript

История
Версия Изменения
v22.18.0

Удаление типов больше не сопровождается предупреждением об экспериментальном статусе.

v22.18.0

Удаление типов включено по умолчанию.

v22.7.0

Добавлен флаг --experimental-transform-types.

Стабильность: 1.2 — кандидат на выпуск

Включение

Есть два способа включить поддержку TypeScript во время выполнения в Node.js:

  1. Для полной поддержки всего синтаксиса и всех возможностей TypeScript, включая использование любой версии TypeScript, воспользуйтесь сторонним пакетом.

  2. Для облегчённой поддержки можно использовать встроенную поддержку удаления типов.

Полная поддержка TypeScript

Чтобы использовать TypeScript с полной поддержкой всех его возможностей, включая tsconfig.json, можно воспользоваться сторонним пакетом. В этих инструкциях в качестве примера используется tsx, но доступно множество других похожих библиотек.

  1. Установите пакет как зависимость для разработки с помощью любого менеджера пакетов, используемого в вашем проекте. Например, с npm:

    npm install --save-dev tsx copy
  2. Затем можно запустить код TypeScript с помощью:

    npx tsx your-file.ts copy

    Или запустить его с помощью node следующим образом:

    node --import=tsx your-file.ts copy

Удаление типов

Добавлено в: v22.6.0

Флаг --no-experimental-strip-types запрещает Node.js запускать файлы TypeScript. По умолчанию Node.js выполняет только файлы, не содержащие возможностей TypeScript, требующих преобразования, например перечислений. Node.js заменяет встроенные аннотации типов пробелами, проверка типов не выполняется. Чтобы включить преобразование таких возможностей, используйте флаг --experimental-transform-types. Возможности TypeScript, зависящие от настроек в tsconfig.json, например пути или преобразование синтаксиса новых версий JavaScript в более старые стандарты, намеренно не поддерживаются. Чтобы получить полную поддержку TypeScript, см. раздел Полная поддержка TypeScript.

Функция удаления типов предназначена для облегчённого использования. Намеренно не поддерживая синтаксис, требующий генерации кода JavaScript, и заменяя встроенные типы пробелами, Node.js может запускать код TypeScript без исходных карт.

Удаление типов совместимо с большинством версий TypeScript, но мы рекомендуем использовать версию 5.8 или новее со следующими настройками tsconfig.json:

{
  "compilerOptions": {
     "noEmit": true, // Optional - see note below
     "target": "esnext",
     "module": "nodenext",
     "rewriteRelativeImportExtensions": true,
     "erasableSyntaxOnly": true,
     "verbatimModuleSyntax": true
  }
} copy

Используйте параметр noEmit, если вы собираетесь выполнять только файлы *.ts, например скрипт сборки. Этот флаг не понадобится, если вы собираетесь распространять файлы *.js.

Определение системы модулей

Node.js поддерживает синтаксис CommonJS и ES Modules в файлах TypeScript. Node.js не преобразует одну систему модулей в другую: если вы хотите, чтобы код выполнялся как модуль ES, необходимо использовать синтаксис import и export, а если вы хотите, чтобы код выполнялся как CommonJS, необходимо использовать require и module.exports.

  • Для файлов .ts система модулей определяется так же, как для файлов .js. Чтобы использовать синтаксис import и export, добавьте "type": "module" в ближайший родительский файл package.json.
  • Файлы .mts всегда выполняются как модули ES, как и файлы .mjs.
  • Файлы .cts всегда выполняются как модули CommonJS, как и файлы .cjs.
  • Файлы .tsx не поддерживаются.

Как и в файлах JavaScript, расширения файлов обязательны в инструкциях import и выражениях import(): import './file.ts', а не import './file'. Из соображений обратной совместимости расширения файлов также обязательны в вызовах require(): require('./file.ts'), а не require('./file'), как и обязательное расширение .cjs в вызовах require в файлах CommonJS.

Параметр tsconfig.json allowImportingTsExtensions позволит компилятору TypeScript tsc проверять типы файлов со спецификаторами import, содержащими расширение .ts.

Возможности TypeScript

Поскольку Node.js только удаляет встроенные типы, использование любых возможностей TypeScript, предполагающих замену синтаксиса TypeScript новым синтаксисом JavaScript, приведёт к ошибке, если не передать флаг --experimental-transform-types.

Наиболее заметные возможности, требующие преобразования:

  • Объявления Enum
  • namespace с кодом времени выполнения
  • Устаревшие module с кодом времени выполнения
  • свойства параметров
  • псевдонимы импорта

Поддерживаются namespaces и module, не содержащие кода времени выполнения. Этот пример будет работать правильно:

// This namespace is exporting a type
namespace TypeOnly {
   export type A = string;
} copy

В этом случае возникнет ошибка ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX:

// This namespace is exporting a value
namespace A {
   export let x = 1
} copy

Поскольку декораторы в настоящее время являются предложением TC39 этапа 3 и вскоре будут поддерживаться движком JavaScript, они не преобразуются и вызовут ошибку парсера. Это временное ограничение, которое будет устранено в будущем.

Кроме того, Node.js не читает файлы tsconfig.json и не поддерживает возможности, зависящие от настроек в tsconfig.json, например пути или преобразование синтаксиса новых версий JavaScript в более старые стандарты.

Импорт типов без ключевого слова type

Из-за особенностей удаления типов ключевое слово type необходимо для правильного удаления типов при импорте. Без ключевого слова type Node.js будет рассматривать импорт как импорт значения, что приведёт к ошибке во время выполнения. Для соответствия такому поведению можно использовать параметр tsconfig verbatimModuleSyntax.

Этот пример будет работать правильно:

import type { Type1, Type2 } from './module.ts';
import { fn, type FnParams } from './fn.ts'; copy

В этом случае возникнет ошибка во время выполнения:

import { Type1, Type2 } from './module.ts';
import { fn, FnParams } from './fn.ts'; copy

Формы ввода, не являющиеся файлами

Удаление типов можно включить для --eval и STDIN. Система модулей будет определяться по --input-type, как и для JavaScript.

Синтаксис TypeScript не поддерживается в REPL, --check и inspect.

Исходные карты

Поскольку встроенные типы заменяются пробелами, исходные карты не нужны для правильного отображения номеров строк в трассировках стека, и Node.js не создаёт их. Если включён параметр --experimental-transform-types, исходные карты включаются по умолчанию.

Удаление типов в зависимостях

Чтобы препятствовать публикации авторами пакетов пакетов, написанных на TypeScript, Node.js отказывается обрабатывать файлы TypeScript в папках внутри пути node_modules.

Псевдонимы путей

tsconfig "paths" не преобразуются и поэтому приводят к ошибке. Ближайшая доступная возможность — импорт подпутей, с тем ограничением, что они должны начинаться с #.

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v22.x/docs/api/typescript.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API