在深度克隆对象时,Typescript Error 2345

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在深度克隆对象时,Typescript Error 2345相关的知识,希望对你有一定的参考价值。

我想用typescript实现深度克隆对象。但是存在一个我无法处理它的错误。

export function cloneDeep <T>(obj: T): T  
  if (!obj || typeof obj !== 'object') 
    return obj
  

  const result: any = isArray(obj) ? [] : 
  return Object.keys(obj).forEach((key: keyof T) => 
    if (obj[key] && typeof obj[key] === 'object') 
      result[key] = cloneDeep(obj[key])
     else 
      result[key] = obj[key]
    
  )

错误信息

TS2345:类型'(key:keyof T)=> void'的参数不能分配给'(value:string,index:number,array:string [])=> void'类型的参数。参数“key”和“value”的类型不兼容。类型'string'不能分配给'keyof T'类型。

答案

两个问题:

  1. Object.keys总是将键作为字符串返回(因此与keyof T不兼容)。
  2. Array.prototype.forEach不返回任何东西。
export function cloneDeep<T>(obj: T): T  
  if (!obj || typeof obj !== 'object') 
    return obj
  

  const result: any = isArray(obj) ? [] : ;

  // Drop annotation of `key`.
  Object.keys(obj).forEach(key => 
    if (obj[key] && typeof obj[key] === 'object') 
      result[key] = cloneDeep(obj[key])
     else 
      result[key] = obj[key]
    
  );

  // Return result
  return result;

以上是关于在深度克隆对象时,Typescript Error 2345的主要内容,如果未能解决你的问题,请参考以下文章

Js深度克隆解析

如何克隆对象数组 TypeScript?

JSON对象实现深度克隆

关于JavaScript对象深度克隆

克隆数组

JS的深度克隆,利用构造函数原型深度克隆