【发布时间】:2021-03-25 09:24:27
【问题描述】:
我正在尝试编写一个接受 Iterable<T> 或 `AsyncIterable 的函数并对其进行映射:
function map<T, U>(
fn: (item: T) => U,
items: Iterable<T> | AsyncIterable<T>,
): Iterable<U> | Iterable<U> & AsyncIterable<U> {
async function* asyncMapper() {
for await (const item of items) {
yield fn(item);
}
}
if (!items[Symbol.iterator]) {
return asyncMapper()
}
return {
*[Symbol.iterator]() {
for (const item of items) {
yield fn(item);
}
},
[Symbol.asyncIterator]: asyncMapper,
};
}
它的要点是,如果项目实现Symbol.iterator,我们将返回一个可以同步迭代和异步的迭代。但是,如果我们不这样做,我们将只返回异步迭代。
问题是由于错误,我无法对Symbol.iterator 的存在进行类型保护:
错误 TS7053: 元素隐式具有
any类型,因为symbol类型的表达式不能用于索引类型Iterable<T> | AsyncIterable<T>。
有谁知道如何对Symbol.iterator 进行打字,或者我在这里做错了什么?
【问题讨论】:
标签: typescript iterable typeguards