当前位置:  开发笔记 > 编程语言 > 正文

TypeScript中的深度克隆(保留类型)

如何解决《TypeScript中的深度克隆(保留类型)》经验,为你挑选了2个好方法。

我需要在TypeScript中深度克隆一个对象.这应该不是问题,因为像Lodash这样的库提供了适当的功能.但是,这些似乎丢弃了类型信息.

> var a = new SomeClass();
> a instanceof SomeClass;
< true
> var b = _.cloneDeep(a);
> b instanceof SomeClass;
< false

有没有办法在保留此类型信息的同时克隆TypeScript中的对象?



1> Retsam..:

打字稿不会丢弃类型信息.在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");
}


2> Martin Vseti..:

有一篇关于深度克隆的有趣博客文章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()源代码 ] [ 完整源代码 ]

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有