我想用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'类型。
答案 0 :(得分:0)
两个问题:
Object.keys
始终以字符串形式返回键(因此与keyof T
不兼容)。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;
}