Node.js が TypeScript を実装しなかった理由に関する簡単な記事。
以下は、Node.js で TypeScript に関して が行われたこと と が行われていないこと の説明です。
この記事は、Node.js チームや TypeScript チームを批判することを目的としたものではありません。
実際には全く逆です。
Node.js チームは TypeScript をこのように「実装」するという最善の選択をしたと本気で思います。
ここで特に強調したいのは、Node.js は TypeScript を実装していないということです。彼らはそれに何らかのサポートを追加しただけです。これは重要な違いですが、Node.js と TypeScript についての議論では見落とされがちだと思います。
過去 2 週間で、読んだニュースレターで引用された Node.js の TypeScript 実装について言及した記事が 50 件以上ありました。
この点をきっぱりと明確にする時期が来たと思います。
ネタバレ注意: Node.js は TypeScript を実装していません。
2010 年、Microsoft は言語に静的型付けを追加する JavaScript のスーパーセットである TypeScript をリリースしました。 TypeScript は、タイプ セーフの欠如や大規模なコードベースの保守の難しさなど、JavaScript のいくつかの欠点に対処するように設計されました。 TypeScript はリリース以来、開発者の間で人気があり、多くのプロジェクトが TypeScript を主要言語として採用しています。
最新の State Of JS Survey によると、TypeScript は事実上どこにでも存在します。 78% の開発者が開発時間の少なくとも 50% で TypeScript を使用しているため、「Node.js に TypeScript が実装されました」 の反響が Web の最も奥深いところにまで届いたのも不思議ではありません。
しかし、念のため言っておきますが、そんなことは起こりませんでした。そしておそらくそれは決してないだろう。
Node.js が TypeScript を実装しなかった理由はいくつかあります。私が考える最も重要なものは次の 2 つです:
実行時に enum がどのようになるかご存知ですか?オブジェクト。
これは、幸運なことに、TypeScript が実行時にどのように物事を注入するかを示す数少ない例の 1 つにすぎません。これは Node.js にとって問題です。ランタイムが TypeScript の機能を認識する必要があり、多くの複雑さとオーバーヘッドが発生することになるからです。
Node.js が ECMAScript との一貫性を維持し、その存続期間中依存関係の管理に対処する必要がない場合、現在の形式では TypeScript を依存関係として受け入れることができません。
TypeScript はセマンティック バージョニング (semver) に従いません。
一方、Node.js は semver に厳密に従っており、3 つの異なるリリース ラインがあります (現在、18.x、20.x、22.x があります)。これは、重大な変更がマイナー リリースまたはパッチ リリースで導入される可能性があり、既存のコードとの互換性の問題が発生する可能性があることを意味します。
また、サポートされているプラットフォームの数は膨大であるため、すべてをチェックするのは簡単ではありません。
Node.js は、サーバーが壊れる可能性があるため、依存関係として TypeScript を受け入れることができません。これは、Node.js による TypeScript の実装を妨げる根本的な問題です。
ここで混乱が生じます。 Node.js は TypeScript を実装していませんでしたが、実験的なフラグの下に型のストリッピングを追加しました。この機能により、開発者は TypeScript コードを作成し、型情報なしでそれを JavaScript にコンパイルすることができます。これは、開発者が上記の問題を引き起こすことなく Node.js で TypeScript を使用できるようにするための妥協策です。
例が必要ですか?どうぞ:
function sum(a: number, b: number): number { return a b; }
この関数は、 --experimental-strip-types フラグを指定してコンパイルすると、次のようになります:
function sum(a , b ) { return a b; }
それを見ましたか?型はなくなり、スペースに置き換えられました。 でも、なぜ?と疑問に思うかもしれません。そうすることで、ソースマップの参照が保存され、ソースマップの参照を個別にビルドする手間が省けるからです。
内部的には、これは swc をラップする amaro というパッケージを介して行われます。このパッケージは、実際のストリッピングを行うよく知られたビルド ツールです。
もちろん、前述の enums のような TypeScript 固有の機能を使用できないなどの制限が存在します。それでも、sum 関数が 2 つの数値を受け入れて 3 つ目の数値を返すようにするために 135 個の設定ファイルを作成するのを防ぐのは大きな前進です。
チャオ、
マイケル。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3