web-dev-qa-db-ja.com

GUID / typescriptのUUIDタイプ

私はこの機能を持っています:

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'その後、TypeScriptコンパイルエラーが表示されます。

更新: David Sherretが言ったように:コンパイル時に正規表現やその他の関数に基づいて文字列値を保証する方法はありませんが、実行時にすべてのチェックを1か所で行うことは可能です。

11
Rajab Shakirov

文字列の周りにラッパーを作成し、それを渡すことができます:

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