首页 > web前端 > js教程 > 正文

TypeID-JS:类型安全、可排序的 Javascript 唯一 ID

WBOY
发布: 2024-07-16 21:31:00
原创
668 人浏览过

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

自从我们去年首次宣布 TypeID 以来,我们看到了社区的广泛采用和兴趣,社区贡献了 23 种不同语言的客户端,我们的 Typescript 实现每周 NPM 下载量达到 90,000 次.

上周,我们发布了 Typescript 实现 TypeID-JS 的 1.0 版本。为了庆祝此版本的发布,我们想分享更多关于我们编写 TypeID 的原因,以及我们如何使用它来确保 Jetify 的类型安全。

类型安全和唯一标识符

我们在构建 Jetify Cloud 时提出了 TypeID 的想法,Jetify Cloud 是我们在团队中部署和管理基于 Devbox 或 Docker 的项目的解决方案。 Jetify Cloud 的架构有许多我们需要管理的不同实体:Orgs、Users、Deployments、Secrets 和 Projects,所有这些都需要唯一的标识符来区分它们。

最初,我们首先遵循最佳实践并为实体的每个实例分配一个 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 };
};
登录后复制

此函数使用两个 UUID 来查找成员和组织。但是,该函数无法确保memberID和orgID代表正确的实体!如果开发人员不小心使用了我们期望的 orgID 的 memberID,我们只会在运行时发现问题。

当我们寻找这个问题的解决方案时,我们遇到了 Stripe 的对象 ID,它使用前缀将类型信息编码为 ID。这似乎是一个很好的解决方案,但不幸的是,我们找不到一个明确的标准来跨多种语言一致地实现类型化 ID。

TypeID:K可排序、类型安全、全局唯一标识符

TypeID 是我们创建这样一个一致标准的尝试。 TypeID 是一个类型安全、可 K 排序、全局唯一的标识符,其灵感来自 Stripe 的前缀类型。 TypeID 还为其他语言实现其客户端和库提供了一致的标准。

TypeID 将唯一标识符编码为包含三个部分的小写字符串:

  1. 代表 ID 类型的前缀(63 个字符,小写 ASCII 字母)
  2. 下划线 (_) 分隔符
  3. 使用修改后的 Base32 编码将 128 位 UUIDv7 编码为 26 个字符的字符串。
  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 中使用 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 包管理器将 TypeID 添加到您的 JS 项目中。不使用JS? TypeID 有 26 种不同的实现,从 Go 到 OCaml 到 SQL。如果您有兴趣编写自己的 TypeID 实现,可以查看我们的正式规范。

希望增强您的开发团队的实力?

我们的 Jetify 团队构建了强大的开发者工具。使用 Jetify Cloud 简化您的部署和项目,或使用 Devbox 自动化入门 + 开发环境。您可以在 Twitter 上关注我们,或者在我们的 Discord 服务器上与我们的开发人员实时聊天。我们也欢迎在我们的 Github 存储库上提出问题和拉取请求。

以上是TypeID-JS:类型安全、可排序的 Javascript 唯一 ID的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!