我想创建一个派生自Array的新类,除了常规数组方法之外,它还有自己的方法。
export class ObjectCollection<T extends Iidentifier> extends Array<T> {
constructor(collection: T[] = []) {
super(...collection);
}
// used for getting instance from a collection of objects
public getInstance(id: Id) {
return this.find(item => item.Id.toString() === id.toString()) || new
Array<T>();
}
}
我还有从该类继承的子类。
export class TargetCategories extends ObjectCollection<TargetCategory> {
constructor(categories: TargetCategory[] = []) {
super(categories);
}
public getCategoryType(id: Iidentifier): string {
return this[id].Category.length < 2 ? "dummy" : "saved";
}
}
当我实例化TargetCategories对象时,我只能使用数组中的方法。我无法调用getCategoryType和getInstance之类的东西。
答案 0 :(得分:-1)
我把它们放在一起,修复了一些小错误,看起来没问题。
type Id = number;
interface Iidentifier {
Id: number;
}
class ObjectCollection<T extends Iidentifier> extends Array<T> {
constructor(collection: T[] = []) {
super(...collection);
}
// used for getting instance from a collection of objects
public getInstance(id: Id) {
return this.find(item => item.Id.toString() === id.toString()) || new
Array<T>();
}
}
interface TargetCategory extends Iidentifier {
Category: number[];
}
class TargetCategories extends ObjectCollection<TargetCategory> {
constructor(categories: TargetCategory[] = []) {
super(categories);
}
public getCategoryType(id: Iidentifier): string {
return this[id.Id].Category.length < 2 ? "dummy" : "saved";
}
}
let tc = new TargetCategories();
tc.getInstance(1);
tc.getCategoryType({ Id: 2 });
答案 1 :(得分:-1)
我找到了一种工作方式,但我怀疑这是唯一的方式,还是最干净的方式。
interface IDifferentArray {
id: string | number;
}
export class DifferentArray<T extends IDifferentArray> extends Array<T> {
public lengthMessage: () => void;
public otherMethod: () => number;
constructor(items: Array<T> = []) {
super(...items);
this.lengthMessage = function() {
return `My length is ${this.length}`;
}
this.otherMethod = function() {
return 12;
}
}
}
您可以访问本机数组方法,属性并添加自己的实例方法。如果将它放在构造函数之外,它将是一个类方法。
这就是它在普通javascript中的工作方式。我认为es6 /打字稿会模仿真实的OOP,但不要猜测。