使用TypeScript和Rollup构建迭代器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用TypeScript和Rollup构建迭代器相关的知识,希望对你有一定的参考价值。

我正在用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);
        }
    }
}
答案

我没有时间浪费在这上面,除了我发现的与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);
        }
    }
}

以上是关于使用TypeScript和Rollup构建迭代器的主要内容,如果未能解决你的问题,请参考以下文章

将 Rollup、ES 模块、TypeScript 和 JSX 连接在一起时的令人困惑的行为

Rollup、TypeScript、Electron、React 设置

如何摆脱“@rollup/plugin-typescript: Rollup 'sourcemap' 选项必须设置为生成源映射。”警告?

使用汇总生成打字稿定义文件

typescript Rollup.js rxjs全局变量

尝试使用 rollup 和 vueJs 3 构建 vue 组件库