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

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

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

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]删除
最新教程 更多>
  • 从 shell 脚本迁移到“Bun 脚本”
    从 shell 脚本迁移到“Bun 脚本”
    在 zCloud 从事专注于流程自动化和基础设施的项目时,我们经常遇到需要创建多个函数来执行验证和通用流程的情况。仅使用一种操作系统时一切正常,但当涉及多个系统时情况会变得复杂。 在我们的例子中,大部分开发都发生在 Linux 上,但我们还需要确保与 macOS 的兼容性。这通常会导致代码不兼容。 ...
    编程 发布于2024-11-06
  • 您的 Web 项目中 jQuery 库的最佳来源在哪里?
    您的 Web 项目中 jQuery 库的最佳来源在哪里?
    您应该从哪里获取 jQuery 库?当您的项目中包含 jQuery 和 jQuery UI 时,有多个选项可用。让我们深入研究一下每种方法的优缺点。Google JSAPI 与 CDNGoogle JSAPI 提供了一种从 Google 分布式服务器访问 jQuery 的便捷方法。这可以缩短加载时间...
    编程 发布于2024-11-06
  • PHP 设计模式:适配器
    PHP 设计模式:适配器
    适配器设计模式是一种结构模式,允许具有不兼容接口的对象一起工作。它充当两个对象之间的中介(或适配器),将一个对象的接口转换为另一个对象期望的接口。这允许那些因为具有不同接口而不兼容的类在不修改其原始代码的情况下进行协作。 适配器结构 适配器模式一般由三个主要元素组成: 客户端:期望与特定接口的对象一...
    编程 发布于2024-11-06
  • 了解 PHP 中的 WebSocket
    了解 PHP 中的 WebSocket
    WebSockets 通过单个 TCP 连接提供实时、全双工通信通道。与 HTTP 不同,HTTP 中客户端向服务器发送请求并等待响应,WebSocket 允许客户端和服务器之间进行连续通信,而无需多次请求。这非常适合需要实时更新的应用程序,例如聊天应用程序、实时通知和在线游戏。 在本指南中,我们将...
    编程 发布于2024-11-06
  • Visual Studio 2012 支持哪些 C++11 功能?
    Visual Studio 2012 支持哪些 C++11 功能?
    Visual Studio 2012 中的 C 11 功能随着最近发布的 Visual Studio 2012 预览版,许多开发人员对 C 11 功能的支持感到好奇。虽然 Visual Studio 2010 已提供部分 C 11 支持,但新版本提供了扩展的功能。Visual Studio 2012...
    编程 发布于2024-11-06
  • 如何在Windows启动时自动运行Python脚本?
    如何在Windows启动时自动运行Python脚本?
    在 Windows 启动时运行 Python 脚本每次 Windows 启动时执行 Python 脚本对于自动化任务或启动基本程序至关重要。多种方法提供不同级别的自定义和用户控制。自动执行脚本的选项:1。打包为服务:创建 Windows 服务并安装它。此方法在计算机上运行脚本,无论用户是否登录。需要...
    编程 发布于2024-11-06
  • 探索 Astral.CSS:彻底改变网页设计的 CSS 框架。
    探索 Astral.CSS:彻底改变网页设计的 CSS 框架。
    在快节奏的 Web 开发世界中,框架在帮助开发人员高效创建具有视觉吸引力和功能性的网站方面发挥着关键作用。在当今可用的各种框架中,Astral CSS 因其独特的设计理念和易用性而脱颖而出。本文深入探讨了 Astral CSS 的功能、优点和总体影响。 什么是星界? Astral 是一个现代 CSS...
    编程 发布于2024-11-06
  • ESnd 箭头函数综合指南
    ESnd 箭头函数综合指南
    ES6简介 ECMAScript 2015,也称为 ES6 (ECMAScript 6),是对 JavaScript 的重大更新,引入了新的语法和功能,使编码更高效、更易于管理。 JavaScript 是用于 Web 开发的最流行的编程语言之一,ES6 的改进大大增强了其功能。 本...
    编程 发布于2024-11-06
  • 揭示算法和数据结构:高效编程的基础
    揭示算法和数据结构:高效编程的基础
    在这一系列文章中,我将分享我的学习历程,涉及在学术环境和大型科技公司中广泛讨论的两个主题:算法和数据结构。尽管这些主题乍一看似乎令人畏惧,特别是对于像我这样由于其他职业挑战而在整个职业生涯中没有机会深入研究这些主题的人,但我的目标是让它们易于理解。 我将从最基本的概念开始,然后转向更高级的主题,创建...
    编程 发布于2024-11-06
  • 如何使用 pprof 来分析 Go 程序中的 goroutine 数量?
    如何使用 pprof 来分析 Go 程序中的 goroutine 数量?
    使用 pprof 分析 Goroutine 数量检测 Go 程序中潜在的 Goroutine 泄漏需要监控一段时间内活动的 Goroutine 数量。虽然标准 go 工具 pprof 命令提供了对阻塞的深入了解,但它并不直接解决 goroutine 计数问题。要有效地分析 goroutine 数量,...
    编程 发布于2024-11-06
  • 如何将类方法作为回调传递:了解机制和技术
    如何将类方法作为回调传递:了解机制和技术
    如何将类方法作为回调传递后台在某些场景下,您可能需要将类方法作为回调传递给其他函数以提高效率具体任务的执行。本文将指导您完成实现此目的的各种机制。使用可调用语法要将函数作为回调传递,您可以直接将其名称作为字符串提供。但是,此方法不适用于类方法。传递实例方法类实例方法可以使用数组作为回调传递,该数组以...
    编程 发布于2024-11-06
  • 网页抓取 - 有趣!
    网页抓取 - 有趣!
    一个很酷的术语: CRON = 按指定时间间隔自动安排任务的编程技术 网络什么? 在研究项目等时,我们通常会从各个网站编写信息 - 无论是日记/Excel/文档等。 我们正在抓取网络并手动提取数据。 网络抓取正在自动化这一过程。 例子 当在网上搜索运动鞋时,它会显示包...
    编程 发布于2024-11-06
  • 感言网格部分
    感言网格部分
    ?在学习 CSS 网格时刚刚完成了这个推荐网格部分的构建! ?网格非常适合创建结构化布局。 ?现场演示:https://courageous-chebakia-b55f43.netlify.app/ ? GitHub:https://github.com/khanimran17/Testimonia...
    编程 发布于2024-11-06
  • 为什么 REGISTER_GLOBALS 被认为是 PHP 中的主要安全风险?
    为什么 REGISTER_GLOBALS 被认为是 PHP 中的主要安全风险?
    REGISTER_GLOBALS 的危险REGISTER_GLOBALS 是一个 PHP 设置,它允许所有 GET 和 POST 变量在 PHP 脚本中用作全局变量。此功能可能看起来很方便,但由于潜在的安全漏洞和编码实践,强烈建议不要使用它。为什么 REGISTER_GLOBALS 不好?REGIS...
    编程 发布于2024-11-06
  • Nodemailer 概述:在 Node.js 中轻松发送电子邮件
    Nodemailer 概述:在 Node.js 中轻松发送电子邮件
    Nodemailer 是一个用于发送电子邮件的 Node.js 模块。以下是快速概述: Transporter:定义电子邮件的发送方式(通过 Gmail、自定义 SMTP 等)。 const transporter = nodemailer.createTransport({ ... }); ...
    编程 发布于2024-11-06

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

Copyright© 2022 湘ICP备2022001581号-3