ホームページ ウェブフロントエンド jsチュートリアル タイプ セーフティを超えて: ランタイム ピッカーを構築して TypeScript をよりスマートにする

タイプ セーフティを超えて: ランタイム ピッカーを構築して TypeScript をよりスマートにする

Dec 16, 2024 pm 08:25 PM

Beyond Type Safety: making TypeScript smarter by Building a Runtime Picker

免責事項

ねえ、始める前に、はっきりさせておきたいことがあります。私のパッケージ ts-runtime-picker についてたくさん話しますが、これは宣伝記事ではありません。私は私の経験と、それを構築するまでに行った旅を共有しているだけです。 (でもまあ、興味があるなら、ここにパッケージへのリンクがあります?).


TypeScript が私を新しいアイデア (そしてパッケージ) に導いた方法

少し巻き戻してみましょう。そこで、私はしばらく TypeScript を使って作業してきました。私は自分自身を TypeScript プロとは呼びませんが、いくつかの大きなプロジェクトを構築し、会社でそれに取り組んできました。ご存知のとおり、通常は、いくつかの「Hello World」プロジェクト、いくつかの少し複雑なプロジェクト、そしてもちろん、「このエラーは一体何を意味するのか?」を理解するために Google にアクセスすることもかなりありました。または「インターフェイスからフィールドを再度選択するにはどうすればよいですか?」 (意味が分かりましたね?)

ある日、Firebase クラウド機能を使用しているときに問題に遭遇しました。私は createUser エンドポイント上で検証ロジックを作成し、データをトリミングし、通常の CRUD リクエストの処理を行っていました。以前の開発者が作成した次のコードに遭遇するまでは、すべてがスムーズに進んでいたのです。

firebase.collection("users").add(request.data.user);
ログイン後にコピー
ログイン後にコピー

...そして私の中の TypeScript プロが悲鳴を上げていました。 ?

つまり、さあ、、これは重大な危険信号です。右?このようにフィルターされていないユーザー データを直接挿入するのは危険でした。リクエスト データに検証が欠けていて、不要なフィールドをデータベースに挿入してしまったらどうなるでしょうか?あまり良くありません。

すぐにコードを削除しましたが、その後、一瞬フリーズしてしまいました。 ?私は画面を見つめながらこう考えました。「ちょっと待って、request.data をユーザー インターフェイスの型に割り当てるだけなら、TypeScript がこのようなことを止めてくれるんじゃないでしょうか? これで問題は解決するはずではないでしょうか?」 (赤い波線が表示されるのを待ちながら、IDE を希望に満ちた視線で見つめます。)

でもちょっと待ってください… ?‍♂️ TypeScript は魔法ではありません。単なるコンパイル時のチェックですよね?実行時には存在しません。 TypeScript はタイプ セーフティのマスクですが、コードの実行中に実際には何も強制しません。実行時に追加のフィールドが挿入されるのを本当に止めるわけではありません。

そこで、私はチームメイトの 1 人に電話して尋ねました。「おい、アルファベットのすべての文字を含む alphabets という名前のオブジェクトがあり、文字 'a' と ' のみを許可するインターフェイス OnlyTwoLetters を作成するとする」 「b'、アルファベット オブジェクトをそのインターフェイスにキャストすると何が起こるでしょうか?」

// Object with all alphabet letters
const alphabets = {
  a: 'Apple',
  b: 'Banana',
  c: 'Cherry',
  d: 'Date',
  e: 'Eggplant',
  f: 'Fig',
  // ... all the way to z
};

// Interface that only allows 'a' and 'b'
interface OnlyTwoLetters {
  a: string;
  b: string;
}

// Casting alphabets to OnlyTwoLetters
const filteredAlphabets = alphabets as OnlyTwoLetters;

console.log(filteredAlphabets);

ログイン後にコピー
ログイン後にコピー

私のチームメイトは間髪入れずにこう言いました。「ははは、そうですね、それでもすべてのアルファベット文字を取得できるでしょう。TypeScript は実行時にそれを実際に止めることはできないからです。」

くそー。私はそれを知っていた。私は TypeScript が実行時のミスを魔法のように防いでくれるという期待に憧れていました。 ?

しかし、次に、TypeScript が実行時にこれを強制できたらどうなるだろうかと思いつきました。オブジェクトを特定のインターフェイスにキャストし、インターフェイスで定義されていないプロパティを TypeScript で自動的に削除できるとしたらどうなるでしょうか?

それは私の問題を解決するでしょう。


ts-runtime-picker の誕生

そこで、この電球の瞬間に、「これを現実にしてみませんか?」と考えました。 request.data をユーザー インターフェースにキャストできれば、TypeScript を使用して余分なプロパティを 自動的に 削除して、オブジェクトを Firebase に安全に挿入できるようになります。 ?

そしてまさにそのようにして、ts-runtime-picker のアイデアが生まれました。目標は単純でした。TypeScript ユーザーが、特定のインターフェイスで定義されたフィールドに基づいて、オブジェクトから不要なプロパティをフィルターで除外できるパッケージを作成することでした。

一番良かった点は?そうすれば、手動でフィールドを検証したりフィルタリングしたりする必要がなくなります。
の時代は終わりました。

firebase.collection("users").add(request.data.user);
ログイン後にコピー
ログイン後にコピー

仕組み: TypeScript に仕事をさせましょう

ts-runtime-picker を使用すると、プロセス全体が自動化されます。オブジェクトをインターフェイスにキャストすると、パッケージによってインターフェイスで定義されたプロパティのみが保持されることが保証されます。実際の動作は次のとおりです:

前: 手動検証

// Object with all alphabet letters
const alphabets = {
  a: 'Apple',
  b: 'Banana',
  c: 'Cherry',
  d: 'Date',
  e: 'Eggplant',
  f: 'Fig',
  // ... all the way to z
};

// Interface that only allows 'a' and 'b'
interface OnlyTwoLetters {
  a: string;
  b: string;
}

// Casting alphabets to OnlyTwoLetters
const filteredAlphabets = alphabets as OnlyTwoLetters;

console.log(filteredAlphabets);

ログイン後にコピー
ログイン後にコピー

後: ts-runtime-picker を使用

const filteredData = {
  name: requestData.name,
  age: requestData.age,
};

firebase.collection("users").add(filteredData);  // More work, less fun.
ログイン後にコピー

一番良かった点は?このコードはデフォルトでは安全です。手動によるチェックやオブジェクトの操作は必要ありません。 ts-runtime-picker は、ユーザー インターフェイスに存在しないフィールドをすべてフィルターして除外することで、これを自動的に処理します。誤ってフィールドを挿入することを心配することなく、コアロジックだけに集中できます。 ?


怠惰の力 (そしてそれがどのようにイノベーションにつながるのか)

それで、あなたはこう疑問に思うかもしれません。「これはまったくの怠惰から来たのでしょうか?」それに対して私はこう言います: はい、でもいいえです。 ?

確かに、このアイデアの最初のきっかけは、私が少し怠け者だったことから生まれました。データを挿入する必要があるたびにフィールドを手動でフィルターしたくなかったのです。でもね、怠惰が輝きにつながることもあるのよ! 物事を簡単にしたいという願望は、イノベーションの原動力となりえます。

実際、最初は「怠惰」だったにもかかわらず、私はパッケージの構築に 8 時間 を費やしました。はい、その通りです。 ?

しかし、時にはそういうこともあるのです。 「必要性が発明を生む」。この面倒な繰り返しのチェックを避ける必要性が、最終的に私の生活 (そして願わくば他の多くの人々の生活) をずっと楽にする新しいソリューションを生み出しました。

したがって、問題を解決するのに怠惰を責めることもできますが、ts-runtime-pickerを引き起こした問題を解決する必要があったのです。このように、行き詰まったり、怠けたりすることは、必ずしも悪いことではありません。それは、新しくて便利なものが生まれる場所なのです。


結論

これが ts-runtime-picker パッケージの背後にある物語です。 TypeScript の不満から、実際の問題を解決するツールを作成するまでの道のり。このパッケージは、TypeScript ユーザーが開発時だけでなく実行時においてもタイプ セーフティを最大限に活用できるようにするための私なりの方法です。

手動でフィールドをフィルタリングするのにうんざりしている場合、または不要なデータが忍び込むのが心配な場合は、ts-runtime-picker を試してみてください。心配することが 1 つ減り、TypeScript の操作が少しだけスマートになります。 ?

以上がタイプ セーフティを超えて: ランタイム ピッカーを構築して TypeScript をよりスマートにするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

JavaScriptの進化:現在の傾向と将来の見通し JavaScriptの進化:現在の傾向と将来の見通し Apr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

See all articles