GUID / UUID type in typescript

前端 未结 2 1900
花落未央
花落未央 2020-12-17 15:08

I have this function:

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

where id is actually GUID. Typescript doesn\'t have

相关标签:
2条回答
  • 2020-12-17 15:42

    You could create a wrapper around a string and pass that around:

    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

    Another way of doing this is to use a brand:

    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) {
    }
    
    0 讨论(0)
  • 2020-12-17 15:45

    I think one should extend a bit on the answer by David Sherret.
    Like this:

    // export 
    class InvalidUuidError extends Error {
        constructor(m?: string) {
            super(m || "Error: invalid UUID !");
    
            // Set the prototype explicitly.
            Object.setPrototypeOf(this, InvalidUuidError.prototype);
        }
    
    }
    
    
    // export 
    class UUID 
    {
        protected m_str: string;
    
        constructor(str?: string) {
            this.m_str = str || UUID.newUuid().toString();
    
            let reg:RegExp = new RegExp("[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}", "i")
            if(!reg.test(this.m_str))
                throw new InvalidUuidError();
        }
    
        toString() {
            return this.m_str;
        }
    
        public static newUuid(version?:number) :UUID
        {
            version = version || 4;
    
    
            // 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
            }
            let uuid:string = ('xxxxxxxx-xxxx-' + version.toString().substr(0,1) + 'xxx-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);
            });
    
            return new UUID(uuid);
        }
    }
    
    
    function getProduct(id: UUID) {    
        alert(id); // alerts "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
    }
    
    
    const guid2 = new UUID();
    console.log(guid2.toString()); // some guid string
    
    
    const guid = new UUID("xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx");
    getProduct(guid); // ok
    getProduct("notGuidbutJustString"); // errors, good
    
    0 讨论(0)
提交回复
热议问题