ホームページ  >  記事  >  ウェブフロントエンド  >  TypeID-JS: Javascript 用のタイプ セーフ、K ソート可能な一意の ID

TypeID-JS: Javascript 用のタイプ セーフ、K ソート可能な一意の ID

WBOY
WBOYオリジナル
2024-07-16 21:31:00875ブラウズ

TypeID-JS: Type Safe, K-Sortable Unique IDs for Javascript

昨年初めて TypeID を発表して以来、コミュニティからの大幅な採用と関心が見られ、コミュニティから提供された 23 の異なる言語クライアントと、Typescript 実装の NPM による毎週 90,000 のダウンロードが行われました。 .

先週、私たちは Typescript 実装である TypeID-JS のバージョン 1.0 をリリースしました。このリリースを記念して、TypeID を作成した理由と、それを Jetify でタイプ セーフを確保するためにどのように使用するかについてさらに詳しく共有したいと思いました。

タイプセーフティと一意の識別子

私たちは、チーム全体で Devbox または Docker ベースのプロジェクトを展開および管理するためのソリューションである Jetify Cloud を構築する際に、TypeID のアイデアを開発しました。 Jetify Cloud のアーキテクチャには、組織、ユーザー、デプロイメント、シークレット、プロジェクトなど、管理する必要があるさまざまなエンティティがあり、それらを区別するために一意の識別子が必要です。

当初、私たちはベスト プラクティスに従い、エンティティの各インスタンスに UUID を割り当てることから始めました。それでも、すぐに問題に遭遇しました。UUIDv7 にはタイプ セーフがありません。以下のコードを例として取り上げます:

export const getMember = async (
  memberId: UUID,
  orgId: UUID,
) => {
  const { member, organization } =
    await authClient.organizations.members.get({
      organization_id: orgId,
      member_id: memberId,
    });

  return { member, organization };
};

この関数は 2 つの UUID を使用してメンバーと組織を検索します。ただし、この関数は memberID と orgID が正しいエンティティを表すことを保証できません。開発者が orgID を予期していた memberID を誤って使用した場合、問題は実行時にのみ発見されます。

この問題の解決策を探していたところ、プレフィックスを使用して型情報を ID にエンコードする Stripe の Object ID に出会いました。これは素晴らしい解決策のように思えましたが、残念ながら、複数の言語にわたって型付き ID を一貫して実装するための明確に定義された標準が見つかりませんでした。

TypeID: K ソート可能、タイプセーフ、グローバルに一意の識別子

TypeID は、そのような一貫した標準を作成するための私たちの試みです。 TypeID は、Stripe の接頭辞付き型からインスピレーションを得た、タイプセーフで K ソート可能なグローバルに一意な識別子です。 TypeID は、他の言語がクライアントやライブラリを実装するための一貫した標準も提供します。

TypeID は、一意の識別子を次の 3 つの部分からなる小文字の文字列としてエンコードします。

  1. ID のタイプを表すプレフィックス (63 文字、小文字の ASCII 文字)
  2. アンダースコア (_) 区切り文字
  3. 変更された Base32 エンコーディングを使用して 26 文字の文字列としてエンコードされた 128 ビット UUIDv7。
  user_2x4y6z8a0b1c2d3e4f5g6h7j8k
  └──┘ └────────────────────────┘
  type    uuid suffix (base32)

この形式を使用すると、TypeID 互換クライアントは型情報を ID にエンコードおよびデコードし、ビルド時またはコンパイル時にチェックを実行して、正しい ID を使用していることを確認できます。たとえば、ユーザー エンティティのランダムな TypeID を作成したい場合は、次のようなことができます:

TypeID を使用すると、関数に型チェックを追加し、実行時にエラーをキャッチすることもできます。上記の例を書き直すと、開発者が適切な場所で適切な ID を使用することが確実になります:

import { TypeID } from 'typeid-js';

export const getMember = async (
  memberId: TypeID<'member'>,
  orgId: TypeID<'org'>,
) => {
    ...
}

この形式には、タイプ セーフに加えて、開発者が使いやすいようにするいくつかのプロパティがあります。

  1. UUIDv7 互換: プレフィックスを削除し、サフィックスをデコードすることで、TypeID を UUID に簡単に変換できます。
  2. K-sortable: TypeID をデータベース内のソート可能な主キーとして局所性よく使用できます。
  3. URL セーフ: URL のコピー、貼り付け、共有を簡単にするために、URL に TypeID を使用します。 URL に TypeID を含めると、ページ状態の生成が簡素化されます。
  4. 簡単に選択可能: ダブルクリックでコピー&ペーストできます (試してみましょう)

TypeID-JS v1.0 の新機能

本日、TypeID-JS ライブラリのバージョン 1.0 を発表します。このアップデートでは、使いやすさとタイプの安全性を向上させるために、次のようないくつかの新機能が追加されています。

  1. ボックス化されていない関数ベースのストリーミング可能な TypeID: これにより、TypeID を文字列にキャストせずにシリアル化できるようになり、TypeID をマップとセットのキーとして使用できるようになります。
  2. より厳密な型とランタイムのチェック: 空の文字列または間違った接頭辞を持つ typeid を解析しようとすると、TypeID がエラーをスローするようになりました。
  3. TypeID 仕様 v3 との互換性: JS TypeID ではプレフィックスにアンダースコアを使用できるようになりました。例: pro_subscription_2x4y6z8a0b1c2d3e4f5g6h7j8k は、プレフィックス pro_subscription を持つ有効な TypeID です。

プロジェクトで TypeID を使用する方法

選択した NodeJS パッケージ マネージャーを使用して、JS プロジェクトに TypeID を追加できます。 JS を使用していないのですか? TypeID には、Go から OCaml、SQL まで、26 の異なる実装があります。 TypeID の独自の実装を記述することに興味がある場合は、正式な仕様を確認してください。

開発チームを強化したいですか?

Jetify のチームは強力な開発者ツールを構築しています。 Jetify Cloud でデプロイメントとプロジェクトを簡素化するか、Devbox でオンボーディングと開発環境を自動化します。 Twitter で私たちをフォローしたり、Discord サーバーで開発者とライブでチャットしたりできます。 Github リポジトリでの問題やプル リクエストも歓迎します。

以上がTypeID-JS: Javascript 用のタイプ セーフ、K ソート可能な一意の IDの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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