深度克隆对象时出现Typescript错误2345

时间:2019-03-01 04:40:56

标签: typescript

我想用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:T的键)=> void'的参数不可分配给   类型'(value:string,index:number,array:string [])的参数=>   无效”。       参数“键”和“值”的类型不兼容。         不能将'string'类型分配给'keyof T'类型。

1 个答案:

答案 0 :(得分:0)

两个问题:

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