@babel/plugin-transform-typescript
ПРИМЕЧАНИЕ: Этот плагин включён в
@babel/preset-typescript
Этот плагин добавляет поддержку синтаксиса типов, используемого языком программирования TypeScript. Однако этот плагин не добавляет возможность проверки типов переданного ему JavaScript-кода. Для этого вам потребуется установить и настроить TypeScript.
Обратите внимание, что, хотя компилятор TypeScript tsc активно поддерживает определённые предложения JavaScript, такие как опциональную цепочку (?.), нулевое слияние (??) и свойства классов (this.#x), этот пресет не включает эти возможности, потому что они не относятся к синтаксису типов, доступному только в TypeScript. Мы рекомендуем использовать preset-env с preset-typescript, если вы хотите транспилировать эти возможности.
Пример
Вход
const x: number = 0;
Выход
const x = 0;
Установка
- npm
- Yarn
- pnpm
npm install --save-dev @babel/plugin-transform-typescript
yarn add --dev @babel/plugin-transform-typescript
pnpm add --save-dev @babel/plugin-transform-typescript
Использование
С файлом конфигурации (Рекомендуется)
{
"plugins": ["@babel/plugin-transform-typescript"]
}
Через командную строку
babel --plugins @babel/plugin-transform-typescript script.js
Через API Node.js
require("@babel/core").transformSync("code", {
plugins: ["@babel/plugin-transform-typescript"],
});
Настройки
allowDeclareFields
boolean, по умолчанию false
Добавлена в v7.7.0
ПРИМЕЧАНИЕ: Эта настройка будет включена по умолчанию в Babel 8
При включении, поля класса только для типов удаляются только если они имеют префикс модификатором declare:
class A {
declare foo: string; // Removed
bar: string; // Initialized to undefined
}
allowNamespaces
boolean, по умолчанию true
История
| Версия | Изменения |
|---|---|
v7.5.0 |
Добавлена allowNamespaces, по умолчанию false
|
v7.13.0 |
По умолчанию true
|
Включает компиляцию пространств имён TypeScript.
disallowAmbiguousJSXLike
boolean, по умолчанию false
Добавлена в: v7.16.0
Даже когда парсинг JSX не включён, эта опция запрещает использование синтаксиса, который был бы неоднозначным с JSX (<X> y утверждения типов и <X>() => {} аргументы типов). Она соответствует поведению tsc при парсинге .mts и .mjs файлов.
dts
boolean, по умолчанию false
Добавлена в: v7.20.0
Эта настройка включит парсинг в контексте TypeScript, где определённый синтаксис имеет другие правила (например, файлы .d.ts и внутри declare module блоков). Для получения дополнительной информации о контекстах окружения обратитесь к официальному руководству и TypeScript Deep Dive.
isTSX
boolean, по умолчанию false
Принудительно включает парсинг jsx. В противном случае угловые скобки будут обрабатываться как устаревшее утверждение типа TypeScript var foo = <string>bar;. Кроме того, isTSX: true требует allExtensions: true
jsxPragma
string, по умолчанию React
Заменить функцию, используемую при компиляции выражений JSX. Это делается для того, чтобы мы знали, что импорт не является импортом типа и не должен быть удалён.
jsxPragmaFrag
string, по умолчанию React.Fragment
Заменить функцию, используемую при компиляции фрагментов JSX. Это делается для того, чтобы мы знали, что импорт не является импортом типа и не должен быть удалён.
onlyRemoveTypeImports
boolean, по умолчанию false
Добавлена в: v7.9.0
При установке в значение true, преобразование будет удалять только импорты только для типов (введенные в TypeScript 3.8). Это следует использовать только в случае использования TypeScript >= 3.8.
class A {
declare foo: string; // Removed
bar: string; // Initialized to undefined
prop?: string; // Initialized to undefined
prop1!: string // Initialized to undefined
}
optimizeConstEnums
boolean, по умолчанию false
Добавлена в: v7.15.0
При установке в значение true, Babel будет встраивать значения перечислений вместо обычного enum вывода:
// Input
const enum Animals {
Fish,
}
console.log(Animals.Fish);
// Default output
var Animals;
(function(Animals) {
Animals[(Animals["Fish"] = 0)] = "Fish";
})(Animals || (Animals = {}));
console.log(Animals.Fish);
// `optimizeConstEnums` output
console.log(0);
Эта настройка отличается от поведения TypeScript --isolatedModules, которое игнорирует модификатор const и компилирует их как обычные перечисления, и согласуется с поведением по умолчанию TypeScript.
Однако при экспорте const enum Babel будет компилировать его в обычную литерал объекта, чтобы не зависеть от анализа по файлам при его компиляции:
// Input
export const enum Animals {
Fish,
}
// `optimizeConstEnums` output
export var Animals = {
Fish: 0,
};
Настройки компилятора TypeScript
Официальный компилятор TypeScript имеет множество настроек для конфигурирования компиляции и проверки типов. Хотя многие из них не применимы, некоторые поведения могут быть полезны, и их аналоги в Babel могут быть включены с помощью некоторых настроек конфигурации или плагинов.
END_OF_DOCUMENT_MARKER-
--alwaysStrictВы можете использоватьstrictModeопцию парсера:module.exports = { parserOpts: { strictMode: true }, }; --downlevelIterationВы можете использовать@babel/plugin-transform-for-ofплагин. Если вы используете@babel/preset-env,for...ofуже транспилируется с использованием итераторов, если это не поддерживается вашей/вашими целевыми компиляцией(ями).--emitDecoratorMetadataЭта опция не поддерживается официальным пакетом Babel, так как это специфическое дополнение TypeScript, а не часть предложения по дескрипторам. Если вы полагаетесь на эту функцию, вы можете использовать плагин сообщества babel-plugin-transform-typescript-metadata.--esModuleInteropЭто стандартное поведение Babel при транспиляции модулей ECMAScript.-
--experimentalDecoratorsЭта опция включает поддержку предложения по дескрипторам «legacy». Вы можете включить её в Babel, используя@babel/plugin-proposal-decoratorsплагин, но имейте в виду, что есть некоторые незначительные различия.module.exports = { plugins: [["@babel/plugin-proposal-decorators", { legacy: true }]], }; --importHelpersЭто эквивалент пакета@babel/plugin-transform-runtime.---importsNotUsedAsValuesВы можете использоватьonlyRemoveTypeImportsопцию, чтобы воспроизвести это поведение.onlyRemoveTypeImports: trueэквивалентноimportsNotUsedAsValues: preserve, аonlyRemoveTypeImports: falseэквивалентноimportsNotUsedAsValues: remove. Нет эквивалента дляimportsNotUsedAsValues: error.--inlineSourceMapВы можете задатьsourceMaps: "inline"опцию в вашемbabel.config.jsonфайле.--isolatedModulesЭто стандартное поведение Babel, и его нельзя отключить, так как Babel не поддерживает анализ по нескольким файлам.--jsxПоддержка JSX обеспечивается с помощью другого плагина. Если вы хотите, чтобы ваш выходной код содержал код JSX (т.е.--jsx preserve), вам нужен@babel/plugin-syntax-jsxплагин; если вы хотите транспилировать его в стандартный JavaScript (т.е.--jsx reactили--jsx react-native), вы должны использовать@babel/plugin-transform-react-jsxплагин.--jsxFactoryЭто можно настроить, используяpragmaопцию пакета@babel/plugin-transform-react-jsx. Вам также необходимо задатьjsxPragmaопцию этого плагина.-
--module,-mЕсли вы используете бандлер (Webpack или Rollup), эта опция устанавливается автоматически. Если вы используете@babel/preset-env, вы можете использоватьmodulesопцию; в противном случае вы можете загрузить конкретный плагин.--moduleзначение@babel/preset-env'smodulesОдин плагин Nonefalse/ CommonJS"commonjs"или"cjs"@babel/plugin-transform-modules-commonjsAMD"amd"@babel/plugin-transform-modules-amdSystem"systemjs"@babel/plugin-transform-modules-systemjsUMD"umd"@babel/plugin-transform-modules-umdES6илиES2015false/ --outDirПри использовании@babel/cli, вы можете задать--out-dirопцию.--outFileBabel не поддерживает конкатенацию выходных файлов: для этого необходимо использовать бандлер (например, Webpack, Rollup или Parcel). При использовании@babel/cli, вы можете скомпилировать один файл, используя--out-fileопцию.--sourceMapВы можете использовать верхнеуровневуюsourceMaps: trueопцию.--targetBabel не поддерживает нацеливание на конкретную версию языка, но вы можете выбрать, на какие движки вы хотите нацелиться, используя@babel/preset-env. При необходимости вы можете включить отдельные плагины для каждой функции ECMAScript.--useDefineForClassFieldsВы можете использоватьonlyRemoveTypeImportsопцию для воспроизведения этого поведения.--watch,-wПри использовании@babel/cli, вы можете указать--watchопцию.
Особые случаи
Поскольку существуют особенности языка TypeScript, которые полагаются на полную систему типов, чтобы вносить изменения во время выполнения. Этот раздел особых случаев довольно длинный, однако стоит отметить, что некоторые из этих особенностей встречаются только в старых кодовых базах TypeScript и имеют современные эквиваленты в JavaScript, которые вы, вероятно, уже используете.
Поскольку Babel не выполняет проверку типов, код, который синтаксически корректен, но не прошёл проверку типов TypeScript, может успешно быть преобразован, и часто неожиданным или некорректным способом.
-
Этот плагин не поддерживает
export =иimport =, так как они не могут быть скомпилированы в ES.next. Это специфические для TypeScript формыimport/export.Обходные пути:
- Используйте плагин babel-plugin-replace-ts-export-assignment, чтобы преобразовать
export =. - Перейдите к использованию
export defaultиexport const, а такжеimport x, {y} from "z".
- Используйте плагин babel-plugin-replace-ts-export-assignment, чтобы преобразовать
Изменения в вашем
tsconfig.jsonне отражаются в Babel. Процесс сборки всегда будет вести себя так, как будтоisolatedModulesвключён, однако существуют собственные методы Babel для задания многихtsconfig.jsonопций.-
В: Почему Babel не позволяет экспортировать
varилиlet?О: Компилятор TypeScript динамически изменяет способ использования этих переменных в зависимости от того, изменяется ли значение. В конечном счёте, это зависит от модели типов и выходит за рамки Babel. Реализация с наилучшими усилиями преобразует контекстно-зависимые использования переменной таким образом, чтобы всегда использовалась версия
Namespace.Value, а неValue, если она была изменена вне текущего файла. Поэтому разрешение экспортаvarилиletв Babel (поскольку трансформация ещё не написана) скорее всего приведёт к ошибке, если использовать её как будто она неconst.
Поддержка пространств имён
Если у вас есть существующий код, использующий специфичные для TypeScript возможности пространств имён. Babel поддерживает подмножество возможностей пространств имён TypeScript. Если вы рассматриваете написание нового кода, использующего пространства имён, рекомендуется использовать ES2015 import/export вместо этого. Оно не исчезнет, но существуют современные альтернативы.
Только типы
namespaceдолжны быть помеченыdeclareи впоследствии будут безопасно удалены.-
exportпеременной, используяvarилиletвnamespace, приведёт к ошибке: «Не поддерживаются пространства имён, экспортирующие не-константы. Измените на const или…»Обходной путь: Используйте
const. Если требуется какая-либо форма изменения, используйте объект с внутренней изменчивостью. -
namespaceне будут совместно использовать своё пространство. В TypeScript допустимо ссылаться на контекстные элементы, которыеnamespaceнаследует, без квалификации, и компилятор добавит квалификатор. В Babel нет модели типов, и невозможно динамически изменить ссылки, чтобы соответствовать установленному типу родительского объекта.Рассмотрим этот код:
namespace N { export const V = 1; } namespace N { export const W = V; }Компилятор TypeScript преобразует его в нечто подобное:
var N = {}; (function(N) { N.V = 1; })(N); (function(N) { N.W = N.V; })(N);В то время как Babel преобразует его во что-то вроде этого:
var N; (function(_N) { const V = (_N = 1); })(N || (N = {})); (function(_N) { const W = V; })(N || (N = {}));Так как Babel не понимает тип
N, ссылка наVбудетundefined, что приведёт к ошибке.Обходной путь: Явно ссылайтесь на значения, которые не находятся в одном и том же определении пространства имён, даже если они были бы в области видимости согласно TypeScript. Примеры:
namespace N { export const V = 1; } namespace N { export const W = N.V; }Или:
namespace N { export const V = 1; export const W = V; }
© 2014-present Sebastian McKenzie
Licensed under the MIT License.
https://babeljs.io/docs/babel-plugin-transform-typescript/