Определение типа TypeScript для функции flatten - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть простая функция flatten. Идея состоит в том, что он может принимать массив строк или массив массивов строк и всегда возвращать массив строк только одного уровня. Например:

flatten(['a', ['b']]) // returns ['a', 'b']
flatten(['a', 'b']) // returns ['a', 'b']

Вот реализация этой функции

function flatten(arr: ReadonlyArray<string | string[]>): string[] {
   return [].concat(...arr);
}

Я получаю следующую ошибку компилятора TypeScript:

  error TS2769: No overload matches this call.
    Overload 1 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
      Argument of type 'string | string[]' is not assignable to parameter of type 'ConcatArray<never>'.
        Type 'string' is not assignable to type 'ConcatArray<never>'.
    Overload 2 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
      Argument of type 'string | string[]' is not assignable to parameter of type 'ConcatArray<never>'.
        Type 'string' is not assignable to type 'ConcatArray<never>'.

  105   return [].concat(...arr);
                        ~~~~~~

Как определить типы для ввода и вывода этой flatten функции? Я хочу избежать использования типа any.

Ответы [ 2 ]

6 голосов
/ 19 февраля 2020

Я думаю, что компилятор не может понять, какой тип массива должен иметь значение []. Самый простой обходной путь - сказать, что это string[] с утверждением типа :

function flatten(arr: ReadonlyArray<string | string[]>): string[] {
   return ([] as string[]).concat(...arr);
}

Надежда, которая помогает; удачи!

Детская площадка ссылка на код

1 голос
/ 19 февраля 2020

Вы должны указать тип возвращаемого значения, в данном случае это массив строк.

function flatten(arr: ReadonlyArray<string | string[]>): string[] {
    const output: string[] = [];
    return output.concat(...arr);
}
...