2017-05-14 2 views
1

In Google Closure-Compiler können Sie ein generisches verfeinern, indem Sie typeof oder instanceof tun. Zum Beispiel, hier nehme ich eine generische und behandeln sie wie ein Objekt:Veredelung generischer Typ in Typoskript

/** 
* @param {T} obj 
* @return {T} 
* @template T 
*/ 
function cloneIfObject(obj) { 
    if (typeof obj === 'object') { 
    return objectClone(obj); 
    } 
    return obj; 
} 

/** 
* Stub function that only accepts object type 
* 
* @param {!Object} obj 
* @return {!Object} 
*/ 
function objectClone(obj) { 
    return obj; //Pretend to clone 
} 

ich dies in Typoskript versuchte Umsetzung, aber ich bin nicht in der Lage es wie ein Objekt zu behandeln.

function cloneIfObject<T>(obj: T) { 
    if (typeof obj === 'object') { 
     return { ...obj }; //Error: Spread types may only be created from object types. 
    } 

    if (obj instanceof Object) { 
     return { ...obj }; //Error: Spread types may only be created from object types. 
    } 

    return obj; 
} 
+0

Haben Sie versucht, eine Besetzung hinzuzufügen? wie '{... obj}'. Und ist das nicht der gleiche Effekt wie "Object.assign"? –

+0

@ A.Akram Die Besetzung immer noch nicht 'Type‚{}‘ist nicht übertragbar‚sind Sie T'.' eingeben richtig, dass 'Object.assign' die gleiche wie Spread ist. Ich denke 'Object.assign ({}, obj)' funktioniert, aber ich bin gespannt, warum Spread nicht funktioniert. – Kamran224

+0

Eine generische Funktion, die nicht das Argument des generischen Typs verwendet, groß – Dummy

Antwort

2

Sie nicht typeof für verwenden können, was Sie zu tun versuchen:

diese typeof Typ Wachen in zwei verschiedenen Formen erkannt werden: typeof v === "Typname" und typeof v = = "typename", wobei "typename" "number", "string", "boolean" oder "symbol" sein muss. Während TypeScript nicht davon abhält, mit anderen Strings zu vergleichen, erkennt die Sprache diese Ausdrücke nicht als Typwächter.

Der zweite wird eine gültige Verwendung, so schnell wie sie zu beheben this bug (es gibt bereits ein PR).