TypeScript: возвращая `_.orderBy` из функции, какой тип возвращаемого значения использовать? - PullRequest
1 голос
/ 15 октября 2019

Установленные мной пакеты: lodash и @types/lodash.

У меня есть:

import _ from 'lodash';

function doSomething(): string[] {
  const letters = ['c', 'a', 'b'];

  return _.orderBy(letters, [null], ['asc']);
}

console.log(doSomething());

Но return _.orderBy(letters, [null], ['asc']); выдает ошибку:

Type '(string | number | (<U>(callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => U[]) | (() => string) | (() => string) | (() => string | undefined) | ((...items: string[]) => number) | ... 25 more ... | { ...; })[]' is not assignable to type 'string[]'.
  Type 'string | number | (<U>(callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => U[]) | (() => string) | (() => string) | (() => string | undefined) | ((...items: string[]) => number) | ... 25 more ... | { ...; }' is not assignable to type 'string'.
    Type 'number' is not assignable to type 'string'.

И все же ясно, что будет возвращен массив строк.

Есть ли способ исправить это, кроме принудительного приведения его к return _.orderBy(letters, [null], ['asc']) as string[];? Есть ли способ указать тип для orderBy наследуемого от letters?

1 Ответ

1 голос
/ 16 октября 2019

Проблема в том, что значение [null], которое вы передаете аргументу iteratees (второму), не соответствует сигнатуре функции.

Аргумент iteratees задокументировано типа (Array[]|Function[]|Object[]|string[]).

Чтобы исправить ваш вызов, просто замените второй аргумент на [_.identity], который является значением по умолчанию, или в качестве альтернативы установите второй аргумент на undefined, что также приведет к использованию значения по умолчанию. Ознакомьтесь с документами MDN по параметрам по умолчанию .

...