Создание итератора с помощью TypeScript и накопительного пакета

Я пишу приложение на TypeScript и использую Rollup для объединения файлов и Buble / Babel для преобразования скомпилированного Javascript во что-то, что браузер может использовать. Тем не менее, когда я бегу rollup -cЯ получаю ошибку:

semantic error TS2495 Type 'Radius' is not an array type or a string type.

Не уверен, что с этим делать, так как в TypeScript не так много информации об итераторах, которую я могу найти по обычному маршруту поисковой системы. Вот мои файлы:

rollup.config.ts

import typescript from 'rollup-plugin-typescript2';
import uglify from 'rollup-plugin-uglify';
import buble from 'rollup-plugin-buble';

export default {
    input: "./chess-player.ts",
    output: {
        file: "./chess-player.min.js",
        format: "iife"
    },
    watch: {
        include: [
            "./chess-player.ts",
            "./src/*/*.ts",
            "./src/*.ts"
        ]
    },
    plugins: [
        typescript(),
        buble(),
        uglify()
    ]
};

tsconfig.json:

{
    "compilerOptions": {
    "target": "ES2015",
    "module": "ES2015",
    "strict": true,
    "removeComments": true,
    "esModuleInterop": true
    }
}

radius.ts:

export class Radius implements IterableIterator<number> {
    counter: number;
    max?: number;

    [Symbol.iterator](): IterableIterator<number> {
        return this;
    }

    next(): IteratorResult<number> {
        if (!this.max || this.counter < this.max) {
            this.counter++;
            return {
                value: this.counter,
                done: false
            };
        } else {
            this.counter = 0;
            return {
                value: undefined,
                done: true
            };
        }
    }

    constructor(max?: number) {
        this.counter = 0;
        this.max = max;
    }
}

Экземпляр Radius реализуется как свойство на Piece учебный класс. Вот метод, который пытается использовать его:

checkAttackRadius(boardElement: HTMLElement, pieceSquare: Square): void {
    const piece = pieceSquare.piece;
    let vectors = piece.attacks();
    for (let radius of piece.radius) {
        const remaining = this.remaining(vectors);
        if (radius > 14 || remaining === 0) {
            break;
        }
        for (let j = 0; j < vectors.length; j++) {
            this.checkAttackVector(boardElement, pieceSquare, vectors[j], radius);
        }
    }
}

1 ответ

Решение

У меня нет времени на это тратить, кроме того, все остальные вопросы, которые я нашел, связанные с этим на SO, остаются без ответа, что заставляет меня думать, что нет удовлетворительного решения.

Я закончил тем, что удалил Radius класс и добавив это к Piece учебный класс:

radius(): { value: number, done: boolean } {
    while(!this.max || this.counter < this.max) {
        this.counter++;
        return {
            value: this.counter,
            done: false
        };
    }
    this.counter = 0;
    return {
        value: undefined,
        done: true
    };
}

Это в основном генератор без использования каких-либо специфичных для ES2015 интерфейсов. Затем я просто изменил его использование на цикл while:

checkAttackRadius(boardElement: HTMLElement, pieceSquare: Square): void {
    const piece = pieceSquare.piece;
    let vectors = piece.attacks();
    let radius = piece.radius();
    while (!radius.done && radius.value <= 14 && this.remaining(vectors) > 0) {
        radius = piece.radius();
        for (let j = 0; j < vectors.length; j++) {
            this.checkAttackVector(boardElement, pieceSquare, vectors[j], radius.value);
        }
    }
}
Другие вопросы по тегам