”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > TypeID-JS:类型安全、可排序的 Javascript 唯一 ID

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

发布于2024-08-05
浏览:314

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,
  orgId: TypeID,
) => {
    ...
}

除了类型安全之外,这种格式还有一些属性可以方便开发人员使用:

  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.
  4. 的有效 TypeID

如何在您的项目中使用 TypeID

您可以使用您选择的 NodeJS 包管理器将 TypeID 添加到您的 JS 项目中。不使用JS? TypeID 有 26 种不同的实现,从 Go 到 OCaml 到 SQL。如果您有兴趣编写自己的 TypeID 实现,您可以查看我们的正式规范。

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

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

版本声明 本文转载于:https://dev.to/jetify/typeid-js-type-safe-k-sortable-unique-ids-for-javascript-djh?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-04-01
  • 在GO中构造SQL查询时,如何安全地加入文本和值?
    在GO中构造SQL查询时,如何安全地加入文本和值?
    在go中构造文本sql查询时,在go sql queries 中,在使用conting and contement和contement consem per时,尤其是在使用integer per当per当per时,per per per当per. [&​​&&&&&&&&&&&&&&&默元组方法在...
    编程 发布于2025-04-01
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否需要手动调用“ delete”操作员在heap-exprogal exit exit上。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(HEAP内存)的指针。当应用程序退出时,此内存是否会自动发布?通常,是。但是,即使在这...
    编程 发布于2025-04-01
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-04-01
  • 如何配置Pytesseract以使用数字输出的单位数字识别?
    如何配置Pytesseract以使用数字输出的单位数字识别?
    Pytesseract OCR具有单位数字识别和仅数字约束 在pytesseract的上下文中,在配置tesseract以识别单位数字和限制单个数字和限制输出对数字可能会提出质疑。 To address this issue, we delve into the specifics of Te...
    编程 发布于2025-04-01
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 考虑文档中给出的示例:这是内部发生的事情: 现在在3月3日添加另一个月,因为2月在2001年只有2...
    编程 发布于2025-04-01
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    编程 发布于2025-04-01
  • 为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    为什么使用固定定位时,为什么具有100%网格板柱的网格超越身体?
    网格超过身体,用100%grid-template-columns 为什么在grid-template-colms中具有100%的显示器,当位置设置为设置的位置时,grid-template-colly修复了?问题: 考虑以下CSS和html: class =“ snippet-code”> g...
    编程 发布于2025-04-01
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-04-01
  • 如何处理PHP文件系统功能中的UTF-8文件名?
    如何处理PHP文件系统功能中的UTF-8文件名?
    在PHP的Filesystem functions中处理UTF-8 FileNames 在使用PHP的MKDIR函数中含有UTF-8字符的文件很多flusf-8字符时,您可能会在Windows Explorer中遇到comploreer grounder grounder grounder gro...
    编程 发布于2025-04-01
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-04-01
  • \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    \“(1)vs.(;;):编译器优化是否消除了性能差异?\”
    答案: 在大多数现代编译器中,while(1)和(1)和(;;)之间没有性能差异。编译器: perl: 1 输入 - > 2 2 NextState(Main 2 -E:1)V-> 3 9 Leaveloop VK/2-> A 3 toterloop(next-> 8 last-> 9 ...
    编程 发布于2025-04-01
  • 如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    如何解决由于Android的内容安全策略而拒绝加载脚本... \”错误?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    编程 发布于2025-04-01
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-04-01
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-04-01

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3