【问题标题】:Can you write a generic copy object function in typescript?你能用打字稿写一个通用的复制对象函数吗?
【发布时间】:2023-03-16 22:11:02
【问题描述】:

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

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

但这会给出编译器警告:“索引签名参数类型必须是'字符串'或'数字'”。

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

【问题讨论】:

    标签: generics typescript


    【解决方案1】:

    您可以简单地执行以下操作:

    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;
    

    【讨论】:

    • 但这看起来并没有将类型 T 限制为“对象”类型,这意味着即使这样做也不会出现类型错误,例如:copyObject(5)。我在上面的评论中添加的重载解决方案确实会在这种情况下给你一个警告,所以看起来更好。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-04-20
      • 2022-01-24
      • 2021-10-28
      • 2019-06-30
      • 2019-08-12
      • 2019-05-15
      • 1970-01-01
      • 2019-05-26
      • 2019-06-28
      相关资源
      最近更新 更多