@babel/plugin-transform-typescript
このプラグインは @babel/preset-typescript
に含まれています。
このプラグインは、TypeScriptプログラミング言語で使用される型構文のサポートを追加します。ただし、このプラグインは、渡されたJavaScriptの型チェック機能を追加するものではありません。そのためには、TypeScriptをインストールして設定する必要があります。
TypeScriptコンパイラtsc
は、オプションチェーン (?.
)、null合体 (??
)、クラスプロパティ (this.#x
) などの特定のJavaScript提案を積極的にサポートしていますが、このプリセットにはこれらの機能は含まれていないことに注意してください。これらは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"]
}
CLI経由
babel --plugins @babel/plugin-transform-typescript script.js
Node API経由
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>() => {}
型引数) の使用を禁止します。これは、.mts
および .mjs
ファイルを解析する際の tsc
の動作と一致します。
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
出力を使用するのではなく、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);
このオプションは、const
修飾子を無視して通常のenumとしてコンパイルするTypeScriptの--isolatedModules
動作とは異なり、Babelの動作をTypeScriptのデフォルト動作に合わせます。
ただし、const enum
をエクスポートする場合、Babelはコンパイル時にクロスファイル分析に依存する必要がないように、プレーンなオブジェクトリテラルにコンパイルします
// Input
export const enum Animals {
Fish,
}
// `optimizeConstEnums` output
export var Animals = {
Fish: 0,
};
TypeScriptコンパイラオプション
公式のTypeScriptコンパイラには、コンパイル方法と型チェック方法を構成するための多くのオプションがあります。多くは適用されませんが、いくつかの動作は役立つ可能性があり、Babelでの同等の動作は、いくつかの構成オプションまたはプラグインで有効にできます。
-
--alwaysStrict
strictMode
パーサーオプションを使用できます。JavaScriptmodule.exports = {
parserOpts: { strictMode: true },
}; -
--downlevelIteration
@babel/plugin-transform-for-of
プラグインを使用できます。@babel/preset-env
を使用している場合、コンパイルターゲットでサポートされていない場合、for...of
はイテレーターを使用して既にトランスパイルされています。 -
--emitDecoratorMetadata
このオプションは、TypeScript固有の追加であり、デコレーター提案の一部ではないため、公式のBabelパッケージではサポートされていません。この機能に依存している場合は、コミュニティプラグイン babel-plugin-transform-typescript-metadata を使用できます。 -
--esModuleInterop
これは、ECMAScriptモジュールをトランスパイルする際のBabelのデフォルトの動作です。 -
--experimentalDecorators
このオプションは、「レガシー」デコレーター提案のサポートを有効にします。@babel/plugin-proposal-decorators
プラグインを使用してBabelで有効にできますが、いくつかのわずかな違いがあることに注意してください。JavaScriptmodule.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
babel.config.json
ファイルでsourceMaps: "inline"
オプションを設定できます。 -
--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
オプション を使用してカスタマイズできます。また、このプラグインのjsxPragma
オプションを設定する必要があります。 -
--module
,-m
バンドラー(WebpackまたはRollup)を使用している場合、このオプションは自動的に設定されます。@babel/preset-env
を使用している場合は、modules
オプションを使用できます。それ以外の場合は、特定のプラグインをロードできます。--module
値@babel/preset-env
のmodules
単一プラグイン なし
false
/ CommonJS
"commonjs"
または"cjs"
@babel/plugin-transform-modules-commonjs
AMD
"amd"
@babel/plugin-transform-modules-amd
System
"systemjs"
@babel/plugin-transform-modules-systemjs
UMD
"umd"
@babel/plugin-transform-modules-umd
ES6
またはES2015
false
/ -
--outDir
@babel/cli
を使用する場合、--out-dir
オプションを設定できます。 -
--outFile
Babelは出力ファイルの連結をサポートしていません。そのため、バンドラー(Webpack、Rollup、Parcelなど)を使用する必要があります。@babel/cli
を使用する場合は、--out-file
オプションを使用して単一のファイルをコンパイルできます。 -
--sourceMap
トップレベルのsourceMaps: true
オプションを使用できます。 -
--target
Babelは特定の言語バージョンをターゲットにすることをサポートしていませんが、@babel/preset-env
を使用して、ターゲットとするエンジンを選択できます。または、すべてのECMAScript機能に対して個別のプラグインを有効にすることもできます。 -
--useDefineForClassFields
この動作を再現するには、setPublicClassFields
の前提を使用できます。 -
--watch
,-w
@babel/cli
を使用する場合は、--watch
オプションを指定できます。
注意点
TypeScript言語には、実行時に変更を加えるために完全な型システムが利用可能であることに依存する機能があるため、注意点に関するこのセクションは長くなっています。ただし、これらの機能のいくつかは古いTypeScriptコードベースにのみ存在し、現在はおそらくすでに使用している最新のJavaScriptと同等のものがあることに注意してください。
-
Babelは型チェックを行わないため、構文的には正しいが、TypeScriptの型チェックに失敗するコードは、変換に成功する可能性があり、予期しない、または無効な方法で変換されることがよくあります。
-
tsconfig.json
への変更は、Babelには反映されません。ビルドプロセスは、常にisolatedModules
がオンになっているかのように動作します。ただし、tsconfig.json
オプションの多くを設定するためのBabelネイティブの代替方法があります。 -
Q: なぜBabelは
var
またはlet
のエクスポートを許可しないのですか?A: TypeScriptコンパイラは、これらの変数が変更されるかどうかに応じて、これらの変数の使用方法を動的に変更します。最終的に、これは型モデルに依存し、Babelの範囲外です。最善を尽くした実装では、変数が現在のファイルの外部で変更された場合に備えて、コンテキスト依存の変数の使用を、常に
Value
ではなくNamespace.Value
バージョンを使用するように変換します。Babelからvar
またはlet
を許可すること(変換はまだ記述されていない)は、const
ではないかのように使用された場合にバグとして現れる可能性が高くなります。
部分的な名前空間のサポート
TypeScriptのみの名前空間機能を使用する既存のコードがある場合、BabelはTypeScriptの名前空間機能のサブセットをサポートしています。名前空間を使用する新しいコードを作成することを検討している場合は、代わりにES2015のimport
/export
を使用することをお勧めします。それはなくなるわけではありませんが、現代的な代替手段があります。
-
型のみの
namespace
はdeclare
でマークする必要があり、その後安全に削除されます。 -
namespace
内でvar
またはlet
を使用して変数をexport
すると、エラーが発生します:「名前空間は、const以外のものをエクスポートすることは、Babelではサポートされていません。constまたは...に変更してください。」回避策:
const
を使用します。何らかの変更が必要な場合は、内部の可変性を持つオブジェクトを明示的に使用します。 -
namespace
はスコープを共有しません。TypeScriptでは、namespace
が拡張するコンテキストアイテムを修飾なしで参照することは有効であり、コンパイラは修飾子を追加します。Babelには型モデルがなく、親オブジェクトの確立された型に合わせて参照を動的に変更することは不可能です。次のコードを検討してください。
namespace N {
export const V = 1;
}
namespace N {
export const W = V;
}TypeScriptコンパイラは、次のようなものにコンパイルします。
JavaScriptvar N = {};
(function(N) {
N.V = 1;
})(N);
(function(N) {
N.W = N.V;
})(N);一方、Babelは次のようなものに変換します。
JavaScriptvar 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;
}