您可以延长Array
类并通过这样做建立要求#2。
我认为这是一个符合您所有要求的实现:
class MyArray<T> extends Array<T> {
constructor(items?: T[]) {
super();
items && this.addItems(items);
}
public serialize(items: T[]): void {
this.splice(0, this.length);
this.addItems(items);
}
private addItems(items: T[]) {
items.forEach(item => this.push(item));
}
}
class StringsList extends MyArray<string> {
public sayHello(): void { // req. #3
console.log("hello");
}
}
class NumbersList extends MyArray<number> {
public sum(): number { // req. #3
return this.reduce((prev: number, current: number) => prev + current);
}
}
如果您不喜欢泛型部分,您可以简单地扩展Array<any>
.
Examples https://www.typescriptlang.org/play/#src=class%20MyArray%3CT%3E%20extends%20Array%3CT%3E%20%7B%0A%09constructor(items%3F%3A%20T%5B%5D)%20%7B%0A%09%09super()%3B%0A%09%09items%20%26%26%20this.addItems(items)%3B%0A%09%7D%0A%0A%09public%20serialize(items%3A%20T%5B%5D)%3A%20void%20%7B%0A%09%09this.splice(0%2C%20this.length)%3B%0A%09%09this.addItems(items)%3B%0A%09%7D%0A%0A%09private%20addItems(items%3A%20T%5B%5D)%20%7B%0A%09%09items.forEach(item%20%3D%3E%20this.push(item))%3B%0A%09%7D%0A%7D%0A%0Aclass%20StringsList%20extends%20MyArray%3Cstring%3E%20%7B%0A%09public%20sayHello()%3A%20void%20%7B%0A%09%09console.log(%22hello%22)%3B%0A%09%7D%0A%7D%0A%0Aclass%20NumbersList%20extends%20MyArray%3Cnumber%3E%20%7B%0A%09public%20sum()%3A%20number%20%7B%0A%09%09return%20this.reduce((prev%3A%20number%2C%20current%3A%20number)%20%3D%3E%20prev%20%2B%20current)%3B%0A%09%7D%0A%7D%0A%0Alet%20arr1%20%3D%20new%20MyArray(%5B%22hey%22%2C%204%2C%20true%5D)%3B%0Aconsole.log(arr1)%3B%20%2F%2F%20%5B%22hey%22%2C%204%2C%20true%5D%0A%0Aarr1.push(99)%3B%0Aconsole.log(arr1)%3B%20%2F%2F%20%5B%22hey%22%2C%204%2C%20true%2C%2099%5D%0A%0Aarr1.forEach(item%20%3D%3E%20console.log(item))%3B%20%2F%2F%20hey%2C%204%2C%20true%2C%2099%0A%0Alet%20arr2%20%3D%20new%20StringsList(%5B%22str1%22%2C%20%22str2%22%5D)%3B%0Aconsole.log(arr2)%3B%20%2F%2F%20%5B%22str1%22%2C%20%22str2%22%5D%0A%0Aarr2.serialize(%5B%22str3%22%2C%20%22str4%22%5D)%3B%0Aconsole.log(arr2)%3B%20%2F%2F%20%5B%22str3%22%2C%20%22str4%22%5D%0A%0Alet%20arr3%20%3D%20new%20NumbersList(%5B1%2C2%2C3%2C4%2C5%5D)%3B%0Aconsole.log(arr3.sum())%3B%20%2F%2F%2015:
let arr1 = new MyArray(["hey", 4, true]);
console.log(arr1); // ["hey", 4, true]
arr1.push(99);
console.log(arr1); // ["hey", 4, true, 99]
arr1.forEach(item => console.log(item)); // hey, 4, true, 99
let arr2 = new StringsList(["str1", "str2"]);
console.log(arr2); // ["str1", "str2"]
arr2.serialize(["str3", "str4"]);
console.log(arr2); // ["str3", "str4"]
let arr3 = new NumbersList([1,2,3,4,5]);
console.log(arr3.sum()); // 15