首页 > 解决方案 > 如何在 TypeScript 中遍历递归生成器?

问题描述

所以我有这个生成器,它只是从给定数组中获取子集。

export class GenerateThings {
    static *generateSubsets(elements: any[], offset: number = 0) {
        while (offset < elements.length) {
            const first = elements[offset];
            for (const subset of this.generateSubsets(elements, offset + 1)) {
                subset.push(first);
                yield subset;
            }
        }
        yield [];
    }
}

这适用于普通的javascript(当然没有类型)但是当我像这样在TypeScript上构建它时,它说

'generateSubsets' 隐式具有返回类型'any',因为它没有返回类型注释,并且在其返回表达式之一中直接或间接引用。

如果我们在 TypeScript 中使用这种递归方法,有没有办法遍历集合的结果子集?谢谢。

标签: typescript

解决方案


正如上面评论中提到的@DemiPixel,您可以使用该Generator类型作为函数的显式返回类型,例如Generator<any[], void, void>这意味着生成器产生一个数组any,不返回任何内容,并且在调用时不希望传递任何next()内容。

但是,在这种情况下,更好的做法是将事情提升到一个新的水平并使用泛型,以避免使用危险的any

export class GenerateThings {
    static *generateSubsets<T>(elements: T[], offset: number = 0): Generator<T[], void, void> {
        // ...
    }
}

顺便说一句,我认为你的代码不能正常工作,我怀疑你说const first = elements[offset];你的意思是let first = elements[offset++];


推荐阅读