lik*_*rRr 1 javascript arrays iterable class typescript
我想实现一个类似数组的类:
我看到这样的:
class BaseModel {
arr: Array;
constructor(arr: Array<any>) { // <= req. #1
this.arr = arr;
}
serialize(arr) { // <= req. #3
this.arr = arr;
}
}
class ListModel extends BaseModel { // <= req. #4
constructor(arr: Array<any>) { // <= req. #1
super(arr);
}
sayHello() { // <= req. #3
console.log('hello');
}
}
let list = new ListModel([1,2,3]);
list.sayHello();
// expected output:
// 'hello'
list.push(4); // <= req. #2
for (let a of list) { // <= req. #2
console.log(a);
}
// expected output:
// 1
// 2
// 3
// 4
list.serialize([2,3]);
for (let a of list) {
console.log(a);
}
// expected output:
// 2
// 3
Run Code Online (Sandbox Code Playgroud)
打字稿可以吗?我在寻找解决方案,但没有找到更接近这些要求的东西。谢谢!
您可以扩展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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您不喜欢泛型部分,则可以直接扩展Array<any>。
例子:
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
Run Code Online (Sandbox Code Playgroud)