自从我们去年首次宣布 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 是我们创建这样一个一致标准的尝试。 TypeID 是一个类型安全、可 K 排序、全局唯一的标识符,其灵感来自 Stripe 的前缀类型。 TypeID 还为其他语言实现其客户端和库提供了一致的标准。
TypeID 将唯一标识符编码为包含三个部分的小写字符串:
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'>, ) => { ... }
除了类型安全之外,这种格式还有一些属性可以方便开发者使用:
今天,我们宣布推出 TypeID-JS 库的 1.0 版。此更新添加了多项新功能以提高可用性和类型安全性,包括:
您可以使用您选择的 NodeJS 包管理器将 TypeID 添加到您的 JS 项目中。不使用JS? TypeID 有 26 种不同的实现,从 Go 到 OCaml 到 SQL。如果您有兴趣编写自己的 TypeID 实现,可以查看我们的正式规范。
我们的 Jetify 团队构建了强大的开发者工具。使用 Jetify Cloud 简化您的部署和项目,或使用 Devbox 自动化入门 + 开发环境。您可以在 Twitter 上关注我们,或者在我们的 Discord 服务器上与我们的开发人员实时聊天。我们也欢迎在我们的 Github 存储库上提出问题和拉取请求。
以上是TypeID-JS:类型安全、可排序的 Javascript 唯一 ID的详细内容。更多信息请关注PHP中文网其他相关文章!