2017-05-14 99 views
1

在google閉包編譯器中,您可以通過執行typeof或instanceof來優化泛型。 例如,下面我帶一個通用的,把它當作一個對象:在typescript中精煉泛型類型

/** 
* @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 
} 

我試着在打字稿實現這一點,但我不能把它當作一個對象。

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

您是否嘗試添加演員?像'{... obj}'。這與「Object.assign」的效果不一樣嗎? –

+0

@ A.Akram演員仍然失敗'Type'{}'不能分配給'T'類型。' 你說得對,'Object.assign'和spread是一樣的。我認爲'Object.assign({},obj)'有效,但我很好奇爲什麼傳播不起作用。 – Kamran224

+0

不使用泛型類型參數的泛型函數,很棒 – Dummy

回答

2

不能使用typeof爲你正在嘗試做的事:

這些typeof運算型後衛被認爲在兩種不同的形式:typeof運算 v === 「類型名稱」 和typeof運算V = =「typename」,其中「typename」必須是 「number」,「string」,「boolean」或「symbol」。雖然TypeScript不會 阻止您與其他字符串進行比較,但語言不會將這些表達式識別爲類型警衛。

第二個將是一個有效的使用,只要他們修復this bug(已經有一個PR)。