2016-05-10 2 views
4

J'ai cette fonction:type GUID/UUID dactylographiée

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 le type GUID manuellement?

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

donc si au lieu 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' sera une 'notGuidbutJustString' alors je vais voir erreur de compilation dactylographiée. Comme le dit David Sherret: il n'y a aucun moyen d'assurer 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.

+1

La question pertinente est à [Suggestion: type de chaîne Regex validé] (https://github.com/Microsoft/TypeScript/ issues/6579). –

Répondre

13

Vous pouvez créer une enveloppe autour d'une chaîne et passer que près de:

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 
+1

mais ce wrapper déplace mon problème à un autre endroit, car je peux toujours le faire: const guid = new GUID ("notGuidbutJustString"). Bien sûr, je peux ajouter quelques vérifications d'exécution dans la classe GUID mais je veux voir l'erreur avant le démarrage de l'application ... –

+1

@Rajab il n'y a aucun moyen d'assurer une valeur de chaîne basée sur regex ou une autre fonction au moment de la compilation. Je recommanderais des tests unitaires écrits pour attraper ce problème. –

+0

C'est dommage. Peut-être que cela va changer à l'avenir mais de toute façon votre réponse est utile. Merci! –