Почему я получаю сообщение об ошибке TypeScript «Нет перегрузки соответствует этому вызову» при использовании массива concat? - PullRequest
0 голосов
/ 18 апреля 2020

Я написал функцию для получения первых n элементов из массива:

export const first = <T>(array: T[], n?: number): T[] => {
  if (n) return array.slice(0, n)
  return [].concat(array).shift()
}

Вот ссылка скрипта для воспроизведения.

Компилятор возвращает ошибку

error TS2769: No overload matches this call.
      Overload 1 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
        Argument of type 'T[]' is not assignable to parameter of type 'ConcatArray<never>'.
          The types returned by 'slice(...)' are incompatible between these types.
            Type 'T[]' is not assignable to type 'never[]'.
              Type 'T' is not assignable to type 'never'.
      Overload 2 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
        Argument of type 'T[]' is not assignable to parameter of type 'ConcatArray<never>'.

   return [].concat(array).shift()

Когда я проверяю lib.es5.d.ts файл с VSCode, concat принимает два параметра перегрузки.

concat(...items: ConcatArray<T>[]): T[];
concat(...items: (T | ConcatArray<T>)[]): T[];

Увидев второй тип вызова, Я попытался изменить первый параметр функции first с array: T[] на array: (T | ConcatArray<T>)[], но затем он возвращает ошибку,

Overload 2 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
    Argument of type '(T | ConcatArray<T>)[]' is not assignable to parameter of type 'ConcatArray<never>'

Что я должен сделать, чтобы исправить эти ошибки? Я новичок в TypeScript, так что извините, если это глупый вопрос.

1 Ответ

0 голосов
/ 18 апреля 2020

В этом выпуске github вы можете увидеть, почему массив имеет тип никогда не , основной ответ:

Это вызвано комбинацией строгого и noImplicitAny: false , В общем, мы ожидаем, что если строгий режим включен, noImplicitAny также включен; этот конкретный набор настроек будет демонстрировать странное поведение. Если бы вы включили оба, вы бы увидели ошибку о том, что [] неявно any []; если оба были выключены; мы использовали бы анализ потока управления и обрабатывали бы массив как число [] после pu sh (1);.

Особая комбинация настроек означает, что мы не позволяем себе использовать поток управления анализировать или разрешать массиву быть неявно любым [], поэтому никогда [] не является единственным оставшимся допустимым параметром.

Я бы рекомендовал отключить строгий режим, если вы не собираетесь включать noImplicitAny.

относительно того, как решить вашу проблему, вы можете использовать любой из двух подходов, которые я пишу на этой игровой площадке TS , я рекомендую вам второй, потому что там вы будете учитывать два возможных значения, возвращаемые функцией, в первом вы просто обманываете TS с утверждением типа для возврата T [], но, вероятно, тип будет неопределенным, если у массива нет значения.

const second = <T>(array: T[], n?: number): (T | undefined)[] => {
  if (n) return array.slice(0, 2)

  return [array.shift()]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...