打字稿:类扩展数组,不能分配方法 [英] Typescript: class extending Array, can't assign method

查看:34
本文介绍了打字稿:类扩展数组,不能分配方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 Typescript 和 Vue,但我希望我的框架无关紧要.

I'm working with Typescript and Vue, but I hope that my framework doesn't matter.

我正在尝试像这样扩展数组:

I'm trying to extend Array like that:

class AudioArray extends Array<[number, number]> {
    constructor(size: number) {
        super(size);
    }

    static fromArray(array: Array<number>): AudioArray {
        return array.map((v, i) => [i, v]) as AudioArray;
    }

    addNumber(num: number): AudioArray {
        return this.map((x: [number, number]) => [x[0], x[1] + num]) as AudioArray;
    }
}

export default AudioArray;

然后我将它导入到我的组件中:

and I'm importing it into my component:

<script lang="ts">
import AudioArray from '@/utils/audioarray'

someFunction() {
    const normalArray = [0,1,2,3,4];

    const audioValues = AudioArray.fromArray(normalArray);
    const audioValues2 = audioValues.addNumber(2);
}

我的静态函数 fromArray 工作得很好,但我有这样的消息:

My static function fromArray works very well, but I have such a message:

类型错误:audioValues.addNumber 不是函数"

我已经将 AudioArrayaudioValues 记录到控制台,这是结果

I've logged AudioArray and audioValues to console and here's the result

推荐答案

问题在于如何创建 AudioArray 的实例:

The problem is how you create instances of AudioArray:

static fromArray(array: Array<number>): AudioArray {
    return array.map((v, i) => [i, v]) as AudioArray;
}

您使用 as 强制转换使编译器静音的事实不会使 array.map 的结果成为 AudioArray 的实例(即是,不设置原型链).您需要使用适当的构造函数来做到这一点.

The fact that you use as cast to silence the compiler does not make the result of array.map an instance of AudioArray (that is, does not set prototype chain). You need to use a proper constructor to do that.

class AudioArray extends Array<[number, number]> {
    constructor(size: number) {
         super(size);
    }

    static fromArray(array: Array<number>): AudioArray {
        const ret = new AudioArray(0);
        ret.push(...array.map((v, i) => AudioArray.toRecord(i, v)));
        return ret;
    }

    static toRecord(a1: number, a2: number): [number, number] { 
        return [a1, a2];
    }

    addNumber(num: number): AudioArray {
        const ret = new AudioArray(0);
        ret.push(...this.map((x: [number, number]) => AudioArray.toRecord(x[0], x[1] + num));
        return ret;
    }
}

更一般地说,扩展 Array 以添加方法是有问题的设计,请考虑使用组合是否可以实现您的目标.

More generally, extending Array to add methods is questionable design, think if you can achieve your goal using composition.

这篇关于打字稿:类扩展数组,不能分配方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆