打字稿中的 GUID / UUID 类型

2024-03-16

我有这个功能:

function getProduct(id: string){    
    //return some product 
}

其中 id 实际上是 GUID。 Typescript 没有 guid 类型。是否可以创建类型GUID手动?

function getProduct(id: GUID){    
    //return some product 
}

所以如果相反'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'将会有一些'notGuidbutJustString'然后我会看到打字稿编译错误。

Update:正如 David Sherret 所说:无法在编译时确保基于正则表达式或其他函数的字符串值,但可以在运行时在一个地方进行所有检查。


您可以围绕字符串创建一个包装器并将其传递:

class GUID {
    private str: string;

    constructor(str?: string) {
        this.str = str || GUID.getNewGUIDString();
    }

    toString() {
        return this.str;
    }

    private static getNewGUIDString() {
        // your favourite guid generation function could go here
        // ex: http://stackoverflow.com/a/8809472/188246
        let d = new Date().getTime();
        if (window.performance && typeof window.performance.now === "function") {
            d += performance.now(); //use high-precision timer if available
        }
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
            let r = (d + Math.random() * 16) % 16 | 0;
            d = Math.floor(d/16);
            return (c=='x' ? r : (r & 0x3 | 0x8)).toString(16);
        });
    }
}

function getProduct(id: GUID) {    
    alert(id); // alerts "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
}

const guid = new GUID("xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx");
getProduct(guid); // ok
getProduct("notGuidbutJustString"); // errors, good

const guid2 = new GUID();
console.log(guid2.toString()); // some guid string

Update

另一种方法是使用品牌:

type Guid = string & { _guidBrand: undefined };

function makeGuid(text: string): Guid {
  // todo: add some validation and normalization here
  return text as Guid;
}

const someValue = "someString";
const myGuid = makeGuid("ef3c1860-5ce6-47af-a13d-1ed72f65b641");

expectsGuid(someValue); // error, good
expectsGuid(myGuid); // ok, good

function expectsGuid(guid: Guid) {
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打字稿中的 GUID / UUID 类型 的相关文章

随机推荐

  • 结果显示为空

    我有一个Customer创建的 JSON 对象的值如下 Title Mr FirstName S LastName J Birthday 01 01 2011 Address Line1 Line1 Line2 Line2 City Cit
  • PHP 搜索数组列进行匹配

    我有一个如下所示的数组 其中有多个列 我想在第一列中搜索特定值 并返回匹配的行 这可能吗 例如 Array 0 gt Array id gt 1 column2 gt value2 column3 gt value3 column4 gt
  • 如何在react中使用axios删除单个项目

    我查看了很多文章和帖子 例如this https stackoverflow com questions 26806084 delete a comment react js但它在我的情况下不起作用 我只需要使用 axios 从我的应用程序
  • 在模板中使用导出关键字

    据我了解 可以使用 export 关键字 以便可以通过头文件公开模板类或函数签名 并抽象库文件中的实际实现 谁能提供一个实用的示例程序来说明如何做到这一点 使用时有什么缺点或需要注意的地方吗 编辑 基于答案的后续问题 正如答案中提到的 导出
  • 在 git bash 中找不到 wget 命令

    我已经在我的cmd中尝试过 pip install wget 它显示 gt pip install wget Requirement already satisfied wget in c users user python python3
  • angular2 添加两个数字视图侧

    我希望能够添加两个文本框中的数字 template h1 Adding inputBox Numbers h1 p Num1 p
  • 如何在测试中设置或模拟元素scrollHeight和元素clientHeight?

    我有一个 javascript 函数来检查 html 元素 el 是通过检查确定的大小 function isOverflow element string boolean const el document getElementById
  • PaintComponent 中的图像仅在调整窗口大小后才会显示

    我想用paintComponent Graphics g 使用 for 循环绘制一些图像 但是 JFrame 仅显示为白色屏幕 并且在我调整窗口大小后仅显示黑色背景和图像 import java awt import java awt ev
  • Robolectric:setupActivity() 中的 NullPointerException

    我尝试使用 Robolectric 来测试我的活动 但在尝试使用 Robolectric 设置活动时 我总是收到 NPE 我已按照指南进行操作robolectric org http robolectric org网站 这是我的代码 Con
  • 在GCP中,通过Cloudbuild如何确保仅触发文件中发生更改的那些步骤

    我的问题是 给定下面的 yaml 文件 如果我在 dir process cbd bu data 的任何文件中进行更改 Cloud Build 会在触发时串行运行所有步骤 这会导致时间的浪费 我希望只有该步骤在 cloudbuild 中运行
  • 如何通过bash判断一个线程是不是内核线程?

    如何通过以下方式识别一个线程是不是内核线程bash 我发现你可以通过以下方式识别内核线程ps 如果线程名称包含在 它是一个内核线程 但我认为这不是一个好的解决方案 对于这个问题的任何提示 我将不胜感激 您可以通过查看来确定特定任务是否是 k
  • Magento 中的多种货币

    我已经可以选择更改货币 但还有另一个问题 目前基础货币设置为欧元 这对我来说没问题 但客户可能想要更改它 如果我将基础货币更改为 RON 货币转换器下拉菜单就会消失 如何使用欧元以外的其他货币 但仍可以选择在店内更改货币 警告 magent
  • 我收到“org.apache.catalina.core.StandardContext startInternal SEVERE:错误listenerStart”。一些线索?

    我正在开发一种复杂的 hello world spring web 应用程序 因为它只有最基本的功能 一个控制器和一个视图 用 thymeleaf 制作 简单的数据库连接 oracle 和简单的电子邮件发送功能 现在 我尝试使用我的 IDE
  • 转换电子表格小数格式:以句点和逗号分隔的小数位

    在 OpenOffice Calc 中 可以更改标准美国之间的数字格式 小数点分隔符为句点 以及 SI 国际系统 格式 小数点分隔符为逗号 这可以通过在第一种情况下将语言设置为美国英语 在后一种情况下将语言设置为加拿大法语 在 格式 菜单中
  • C#中使用Threads和ListView的问题

    我有一个文本过滤器 在 TextChanged 事件中我以这种方式启动列表视图填充代码 ThreadPool QueueUserWorkItem new WaitCallback populate 然后在填充方法中我有这样的代码 listV
  • 如何在 Razor 中进行 Active Directory 身份验证 (cshtml)

    我正在用 Razor 做一个简单的网站 目前 我可以使用基于数据库的身份验证 如下所示 在 App Start html中 WebSecurity InitializeDatabaseConnection db connection use
  • ASP .Net 文本框 Textchanged 事件

    我有一个网页 我在页面中显示表格中的记录 比如说学生 我查询所有学生并将他们显示在网格中 我想使用文本框来过滤 datagridview 结果 例如 如果用户在文本框中键入 a 网格将仅显示姓名中包含 a 的学生 我想在编辑文本框的同时刷新
  • VSIX newtonsoft 不在包中 (VS>15.5) 抑制包

    我们有针对 vsix 项目的解决方案 直到 Visual Studio 15 4 版软件包都是使用 newtonsoft json dll 生成的 但是从该版本开始 newsoft 就被排除在软件包之外 据我所知 这是因为 Microsof
  • R / Python / Julia 中 Matlab 的类型转换函数相当于什么

    相当于Matlab的什么typecastR 中的函数 在Python中 在朱莉娅 Matlab的typecast函数的描述如下 typecast http www mathworks com help matlab ref typecast
  • 打字稿中的 GUID / UUID 类型

    我有这个功能 function getProduct id string return some product 其中 id 实际上是 GUID Typescript 没有 guid 类型 是否可以创建类型GUID手动 function g