Функция карри, которая фильтрует по символу, не может получить совместимую реализацию функции в Typescript - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть пакетная функция с карри, которая возвращает 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 Ответ

0 голосов
/ 29 ноября 2018

У меня есть дубликаты определений для 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[]>

Это печатает хорошо.

...