web-dev-qa-db-fra.com

GUID / type UUID en tapuscrit

J'ai cette fonction:

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

où id est en fait GUID. TypeScript n'a pas de type guid. Est-il possible de créer manuellement le type GUID?

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

donc si à la place 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' sera un peu 'notGuidbutJustString' alors je verrai une erreur de compilation TypeScript.

pdate: comme l'a dit David Sherret: il n'y a aucun moyen de garantir une valeur de chaîne basée sur regex ou une autre fonction au moment de la compilation mais il est possible de faire toutes les vérifications en un seul endroit au moment de l'exécution.

11
Rajab Shakirov

Vous pouvez créer un wrapper autour d'une chaîne et le transmettre:

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
17
David Sherret