微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何在Typescript中将变量数组从A类升级到B类从A类扩展出来?

如何解决我如何在Typescript中将变量数组从A类升级到B类从A类扩展出来?

希望它不是重复的,但是我找不到类似的问题。

我已经定义了Array<Tag>,但我希望它是Array<TogglableTag>TogglableTag类仅相差1个以上的属性,但是最干净的方法是什么?

这是我从一开始就拥有的:

export class Tag {
    name:string
    count:number
    identificators:Array<string>

    constructor(name:string,count:number,identificators:Array<string>)
    {
        this.name = name;
        this.count = count;
        this.identificators = identificators
    }
}

我以此为基础制作了数组,现在是Array<Tag>,然后将其存储在JSON.stringified中。

但是应该恢复时,我需要为每个标签添加一个属性isActivated

class TogglableTag extends Tag {
    isActivated:boolean = false;

    constructor (name:string,identificators:Array<string>) {
        super(name,count,identificators)
    }
}

我唯一的想法是,我将遍历整个Array<Tag>以将new TogglableTag()推入空白Array<TogglableTag>

有没有效率更高的东西?

我只想让Tag班级成为TogglableTag。 (适用于所有数组项),因此数组项都将具有isActivated = false

..谢谢您的合作:)

解决方法

假设您的TagTogglableTag实现是一成不变的,然后给定Tag对象的数组:

declare const tagArray: Array<Tag>;

您可以使用其map() method来生成TogglableTag对象的数组:

const togglableTagArray = tagArray.map(
    (tag: Tag) => new TogglableTag(tag.name,tag.count,tag.identificators)
);

当然,如果您可以重构以便使用轻量级interfaces而不是像这样的类,

interface Tag {
    name: string;
    count: number;
    identificators: Array<string>;
}

interface TogglableTag extends Tag {
    isActivated: boolean
}

declare const tagArray: Array<Tag>;

您可以做同样的事情,但是可以通过点差实现更简单的映射功能:

const togglableTagArray = tagArray.map(
    (tag: Tag): TogglableTag => ({ ...tag,isActivated: false })
);

Playground link to code

,

@miqh提出了一些优点。有改善您的结构的空间。

但是要解决映射问题,您需要做的是:

pyelftools

您可以重写构造函数,以便它们采用一个作为props对象的参数,这使从一个到另一个的映射变得容易得多,因为这两个类都实现了props接口,因此您可以传递libdwarfconst togglable = array.map(tag => new TogglableTag(tag.name,tag.identificators)) 实例直接进入构造函数。您甚至不需要知道它是什么。

Tag

Playground Link

或者您可以保留当前的构造函数,并添加静态TogglableTag方法作为构造的另一种方法。然后,您可以像这样映射:

const tags: (Tag | TogglableTag)[] = []

const togglable = tags.map( tag => new TogglableTag(tag) );

const nonTogglable = tags.map( tag => new Tag(tag) );

需要注意的是,我无法找出正确的语法来处理继承,因此我不得不将方法分别放在两个类中才能起作用。 (愚蠢和错误的代码)

Playground Link

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。