2014-03-07 64 views
5

到目前爲止,我已經試過:你可以在打字稿中寫一個通用拷貝對象函數嗎?

function copyObject<K, V> (object: { [k: K]: V; }) { 
    var objectCopy = {}; 

    for (var key in object) 
    { 
     if (object.hasOwnProperty(key)) 
     { 
      objectCopy[key] = object[key]; 
     } 
    } 

    return objectCopy; 
} 

但是,這給出了一個編譯器警告:「指數的簽名參數類型必須是‘串’或‘號’」。

也許有可能將密鑰類型限制爲數字或字符串?或者只是用兩種類型的鍵來重載它?

回答

8

您只需做到以下幾點:

function copyObject<T> (object:T): T { 
    var objectCopy = <T>{}; 

    for (var key in object) 
    { 
     if (object.hasOwnProperty(key)) 
     { 
      objectCopy[key] = object[key]; 
     } 
    } 

    return objectCopy; 
} 

與用法:

// usage: 
var foo = { 
    bar: 123 
}; 

var baz = copyObject(foo); 
baz.bar = 456; 
+0

但是,它看起來不像它將類型T限制爲'對象'類型,這意味着即使你做了也沒有類型錯誤,比如:copyObject(5)。我在上面的評論中添加的超載解決方案在這種情況下會給你一個警告,所以看起來更好。 – AGD

1

打字稿沒有類型類,我不知道,只是字符串和數字類型都滿足任何接口所以超載似乎是唯一的選擇:

export function copyObject<V> (object: { [s: string]: V; }) : { [s: string]: V; } 
export function copyObject<V> (object: { [n: number]: V; }): { [n: number]: V; } 
export function copyObject (object: {}): {} 
export function copyObject (object: {}) { 
    var objectCopy = <any>{}; 

    for (var key in object) 
    { 
     if (object.hasOwnProperty(key)) 
     { 
      objectCopy[key] = (<any>object)[key]; 
     } 
    } 

    return objectCopy; 
} 

(字符串和數字重載al低你複製同類型的對象)

相關問題