类型克隆功能的定义

时间:2018-02-08 10:04:24

标签: typescript

我在js中有一个克隆函数:

 var clone = (o) => {
        var obj = {};
        for (var key in o) {
            if (o.hasOwnProperty(key)) {
                obj[key] = o[key];
            }
        }
        return obj;
    }

它的正确类型定义是什么,以保证克隆对象与输入对象的类型相同?或者我甚至需要调整实施?

2 个答案:

答案 0 :(得分:1)

  

它的正确类型定义是什么,以保证克隆对象与输入对象的类型相同

使用generics

var clone = <T>(o:T):T => {

答案 1 :(得分:1)

如果您想要一个适用于JSON文字的版本,您可以使用以下内容:

var clone = <T>(o: T) => {
    var obj = <T>{};
    for (var key in o) {
        if (o.hasOwnProperty(key)) {
            obj[key] = o[key];
        }
    }
    return obj;
}

如果您想要一个保留更复杂的类的版本,因为您使用{}初始化结果,结果将具有不同的类型,因此instanceof MyClass将不起作用。如果您有一个具有默认构造函数的对象,则可以使用:

var clone = <T>(o: T) => {
    var obj : T = new (<any>o.constructor)();
    for (var key in o) {
        if (o.hasOwnProperty(key)) {
            obj[key] = o[key];
        }
    }
    return obj;
}

或者,如果您想强制使用默认构造函数,并且不介意在课程中传递,您也可以这样做:

var clone = <T>(o: T, ctor: new () => T) => {
    var obj:T  = new ctor();
    for (var key in o) {
        if (o.hasOwnProperty(key)) {
            obj[key] = o[key];
        }
    }
    return obj;
}
class AA {constructor(s: any) {}}
clone(new AA(1), AA); // Will cause an error