我需要在TypeScript中深度克隆一个对象.这应该不是问题,因为像Lodash这样的库提供了适当的功能.但是,这些似乎丢弃了类型信息.
> var a = new SomeClass(); > a instanceof SomeClass; < true > var b = _.cloneDeep(a); > b instanceof SomeClass; < false
有没有办法在保留此类型信息的同时克隆TypeScript中的对象?
打字稿不会丢弃类型信息.在DefinitelyTyped lodash.d.ts文件中,您可以看到cloneDeep
定义为
cloneDeep( val: T, customizer?: (value: any) => any, thisArg?: any ) : T
忽略我们不关心的参数,它需要一个T
输入,并吐出一个T
输出.因此,Typescript不会丢失任何类型的信息; 它认为输出cloneDeep
与输入的类型相同.
您应该能够通过编辑器验证这一点:假设您有一些编辑器可以让您检查变量类型或自动复合方法(如果您不这样做,我强烈建议您这样做).
那么为什么typeof
不按预期工作?这是因为Typescript类型信息不会延续到运行时. instanceof
是一个原生的JS运算符,Typescript不会改变它的行为,你可以通过运行这个代码段看到它:
"use strict";
class A {}
let a = new A();
let b = _.cloneDeep(a);
if (b instanceof A) {
alert("b is an instance of A");
} else {
alert("b is not an instance of A");
}
有一篇关于深度克隆的有趣博客文章http://blog.soulserv.net/understanding-object-cloning-in-javascript-part-ii/.您可以使用作者的深度克隆clone()
功能的实现:
class SomeClass { constructor(public test) { } } let c = new SomeClass("Hey!"); c.test = "Hey!"; console.log(c instanceof SomeClass); // returns true let cloneC = clone(c, /* resolve circular references */ true); console.log(cloneC instanceof SomeClass); // returns true
[ clone()源代码 ] [ 完整源代码 ]