你能用打字稿写一个通用的复制对象函数吗?

时间:2014-03-07 10:40:02

标签: generics typescript

到目前为止,我已经尝试过:

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;
}

但这给出了一个编译器警告:“索引签名参数类型必须是'string'或'number'”。

也许可以将密钥类型约束为数字或字符串?或者只是用两种类型作为键重载它?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

Typescript没有类型类,我不知道任何只有字符串和数字类型满足的接口,所以重载似乎是唯一的选择:

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;
}

(字符串和数字重载允许您复制具有同类型的对象)

相关问题