问题描述
希望它不是重复的,但是我找不到类似的问题。
我已经定义了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
。
..谢谢您的合作:)
解决方法
假设您的Tag
和TogglableTag
实现是一成不变的,然后给定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 })
);
,
@miqh提出了一些优点。有改善您的结构的空间。
但是要解决映射问题,您需要做的是:
pyelftools
您可以重写构造函数,以便它们采用一个作为props对象的参数,这使从一个到另一个的映射变得容易得多,因为这两个类都实现了props接口,因此您可以传递libdwarf
或const togglable = array.map(tag => new TogglableTag(tag.name,tag.identificators))
实例直接进入构造函数。您甚至不需要知道它是什么。
Tag
或者您可以保留当前的构造函数,并添加静态TogglableTag
方法作为构造的另一种方法。然后,您可以像这样映射:
const tags: (Tag | TogglableTag)[] = []
const togglable = tags.map( tag => new TogglableTag(tag) );
const nonTogglable = tags.map( tag => new Tag(tag) );
需要注意的是,我无法找出正确的语法来处理继承,因此我不得不将方法分别放在两个类中才能起作用。 (愚蠢和错误的代码)