Функция карри, которая фильтрует по символу, не может получить совместимую реализацию функции в Typescript
У меня есть пакетная функция с карри, которая возвращает Iterable. Если вы называете это с синхронизацией Iterable
вы получаете синхронизацию Iterable
, если вы даете AsyncIterable
Вы получаете AsyncIterable
, Но я не могу получить перегрузку синхронизации, которая будет принята реализацией функции.
Это конкретное определение, что дает ошибку
export function batch(size: number): <T>(curriedIterable: Iterable<T>) => IterableIterator<T[]>
Вот весь код
async function* _batch<T>(size: number, iterable: AsyncIterable<T>) {
let dataBatch: T[] = []
for await (const data of iterable) {
dataBatch.push(data)
if (dataBatch.length === size) {
yield dataBatch
dataBatch = []
}
}
if (dataBatch.length > 0) {
yield dataBatch
}
}
function* _syncBatch<T>(size: number, iterable: Iterable<T>) {
let dataBatch: T[] = []
for (const data of iterable) {
dataBatch.push(data)
if (dataBatch.length === size) {
yield dataBatch
dataBatch = []
}
}
if (dataBatch.length > 0) {
yield dataBatch
}
}
export function batch(size: number): <T>(curriedIterable: AsyncIterable<T>) => AsyncIterableIterator<T[]>
export function batch<T>(size: number, iterable: AsyncIterable<T>): AsyncIterableIterator<T[]>
export function batch(size: number): <T>(curriedIterable: Iterable<T>) => IterableIterator<T[]>
export function batch<T>(size: number, iterable: Iterable<T>): IterableIterator<T[]>
export function batch<T>(size: number, iterable?: Iterable<T> | AsyncIterable<T>) {
if (iterable === undefined) {
return curriedIterable => batch(size, curriedIterable)
}
if (iterable[Symbol.asyncIterator]) {
return _batch(size, iterable as AsyncIterable<T>)
}
return _syncBatch(size, iterable as Iterable<T>)
}
1 ответ
У меня есть дубликаты определений для function batch(size: number):
когда мне нужны перегруженные определения для его функции возврата. Следующее решает это.
export function batch(size: number): {
<T>(curriedIterable: AsyncIterable<T>): AsyncIterableIterator<T[]>
<T>(curriedIterable: Iterable<T>): IterableIterator<T[]>
}
export function batch<T>(size: number, iterable: AsyncIterable<T>): AsyncIterableIterator<T[]>
export function batch<T>(size: number, iterable: Iterable<T>): IterableIterator<T[]>
Это печатает хорошо.