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

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

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

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]删除
最新教程 更多>
  • 在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    在Ubuntu/linux上安装mysql-python时,如何修复\“ mysql_config \”错误?
    mysql-python安装错误:“ mysql_config找不到”“ 由于缺少MySQL开发库而出现此错误。解决此问题,建议在Ubuntu上使用该分发的存储库。使用以下命令安装Python-MysqldB: sudo apt-get安装python-mysqldb sudo pip in...
    编程 发布于2025-07-02
  • 如何在JavaScript对象中动态设置键?
    如何在JavaScript对象中动态设置键?
    在尝试为JavaScript对象创建动态键时,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正确的方法采用方括号: jsobj ['key''i] ='example'1; 在JavaScript中,数组是一...
    编程 发布于2025-07-02
  • 如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    如何从PHP中的Unicode字符串中有效地产生对URL友好的sl。
    为有效的slug生成首先,该函数用指定的分隔符替换所有非字母或数字字符。此步骤可确保slug遵守URL惯例。随后,它采用ICONV函数将文本简化为us-ascii兼容格式,从而允许更广泛的字符集合兼容性。接下来,该函数使用正则表达式删除了不需要的字符,例如特殊字符和空格。此步骤可确保slug仅包含...
    编程 发布于2025-07-02
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的Python功能Eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。本文深入研究了eval()和ast.literal_eval()之间的差异,突出显示其安全性含义...
    编程 发布于2025-07-02
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-07-02
  • Java为何无法创建泛型数组?
    Java为何无法创建泛型数组?
    通用阵列创建错误 arrayList [2]; JAVA报告了“通用数组创建”错误。为什么不允许这样做?答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<myO...
    编程 发布于2025-07-02
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-07-02
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法表示的字符串时,您可能会遇到错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && ...
    编程 发布于2025-07-02
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否需要手动调用“ delete”操作员在heap-exprogal exit exit上。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(HEAP内存)的指针。当应用程序退出时,此内存是否会自动发布?通常,是。但是,即使在这...
    编程 发布于2025-07-02
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-07-02
  • Python中嵌套函数与闭包的区别是什么
    Python中嵌套函数与闭包的区别是什么
    嵌套函数与python 在python中的嵌套函数不被考虑闭合,因为它们不符合以下要求:不访问局部范围scliables to incling scliables在封装范围外执行范围的局部范围。 make_printer(msg): DEF打印机(): 打印(味精) ...
    编程 发布于2025-07-02
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 考虑文档中给出的示例:这是内部发生的事情: 现在在3月3日添加另一个月,因为2月在2001年只有2...
    编程 发布于2025-07-02
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-07-02
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-07-02
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    在node-mysql node-mysql文档最初出于安全原因最初禁用多个语句支持,因为它可能导致SQL注入攻击。要启用此功能,您需要在创建连接时将倍增设置设置为true: var connection = mysql.createconnection({{multipleStatement:...
    编程 发布于2025-07-02

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

Copyright© 2022 湘ICP备2022001581号-3