【问题标题】:Typescript Error 2345 while deep clone object深度克隆对象时出现 Typescript 错误 2345
【发布时间】:2019-07-23 02:20:32
【问题描述】:

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

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[]) => 类型的参数 空白'。 参数“key”和“value”的类型不兼容。 类型 'string' 不可分配给类型 'keyof T'。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    两个问题:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-09
      • 2012-06-05
      • 2013-09-06
      • 2013-10-11
      • 2018-03-21
      • 2019-03-25
      相关资源
      最近更新 更多