Машинопись кричит мне, что 'строка | T [] 'нельзя назначить параметру типа' ReadonlyArray <T>' - PullRequest
0 голосов
/ 10 марта 2019

Я создаю простую функцию с именем unique.

Для этого нужно удалить все дубликаты из массива или строки, чтобы оно имело function overloading.

Пожалуйста, посмотрите этот пример кода проблемы:

function unique(str: string): string[];
function unique<T>(arr: T[]): T[];

/**
 * Create an `array` without duplicates.
 */

function unique<T>(arrOrString: string | T[]): string[] | T[] {
  return [...new Set(arrOrString)]; // typescript will yell at me at this line.
}

export default unique;

enter image description here

enter image description here

Однако, если я изменю свой код на if-else, но на самом деле ничего не сделаю, машинопись теперь будет удовлетворена этим:


// same code, but actually compiling.

function unique(str: string): string[];
function unique<T>(arr: T[]): T[];

/**
 * Create an `array` without duplicates.
 */

function unique<T>(arrOrString: string | T[]): string[] | T[] {
  if (typeof arrOrString === 'string') {
    return [...new Set(arrOrString)];
  } else {
    return [...new Set(arrOrString)];
  }
}

export default unique;

Почему это происходит? Нужно ли писать [...new Set(arrOrString)] дважды, чтобы это работало?

1 Ответ

1 голос
/ 10 марта 2019

Это потому, что конструктор Set() не может принимать тип string | T[].

Это на самом деле хорошо.

Ваш код обслуживает два сценария: когда вводstring или T[].

Использование перегрузок функций может облегчить использование вашего кода:

function unique<T>(arrOrString: string): string[]
function unique<T>(arrOrString: T[]): T[]
function unique<T>(arrOrString: any): any {
    return [...new Set(arrOrString)];
}

const y = unique('x') // y is string[]

const p = unique([1, 2, 3]) // p is number[]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...