【问题标题】:Creating a class that extends Array创建一个扩展数组的类
【发布时间】:2020-08-15 03:47:26
【问题描述】:

我正在寻找一种方法来扩展 Array 并将构造函数 args 传播到 super

interface Token {
    name: string
}

class Nodes extends Array {
    constructor (v: Token[]) {
        super(...v)
    }
}

const n = new Nodes([{ name: 'Thomas ' }])

这给我带来了问题。这是playground link

我也试过了:

interface Token {
    name: string
}

class Nodes extends Array {
    constructor (v: Token[]) {
        super()
        this.push(...v)
        Object.setPrototypeOf(this, Object.create(Nodes.prototype));
    }
}

const n = new Nodes([{ name: 'Thomas ' }])

console.log(n)

n.map(v => console.log(v.name))

未捕获的类型错误:发现不可调用的@@iterator 在新节点(eval at (main-3.js:1239), :5:14) 在节点.map() 在评估(评估在(main-3.js:1239),:11:3) 在 main-3.js:1239

【问题讨论】:

  • 如果我没有抓住重点,请原谅我,但 Array 需要一个整数作为其构造函数参数,看起来您正试图传入 ...Token[]

标签: arrays typescript class extends


【解决方案1】:

数组构造函数需要一个数字作为参数(数组的长度)。在您的情况下,可以在没有参数的情况下调用 super() 并稍后推送项目。

class Nodes extends Array {
    constructor(v: Token[]) {
        super();
        this.push(...v);
    }
}

【讨论】:

    【解决方案2】:

    试试这个:

    interface Token {
      name: string;
    }
    
    class Nodes extends Array<Token> {
      constructor (...tokens: Token[]) {
        super();
        this.push(...tokens);
      }
    }
    
    const n = new Nodes({ name: 'Thomas ' }, { name: 'Juan' });
    console.log(n);
    n.map(v => console.log(v.name));
    

    对我来说效果很好。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-08
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      相关资源
      最近更新 更多