Как заставить TypeScript знать, какой тип будет возвращен, если параметром generic может быть строка ИЛИ число

#arrays #typescript

#массивы #typescript

Вопрос:

Рассмотрим функцию с подписью ниже:

 function removeNumbersOrStringsElementsFromArray(
    targetArray: Array<number | string>,
    targetElementOrMultipleOfThem: number | string | Array<number | string>
): {
  updatedArray: Array<number | string>;
  removedElementsIndexes: Array<number>;
} {
  // implementation
}
  

Даже если все элементы targetArray являются строками или все элементы являются числами,

 const result: Array<string> = removeNumbersOrStringsElementsFromArray([ 1, 2, 3, 4 ], [ 1, 2 ]).updatedArray;
  

вызовет ошибку:

Type (string|number) is not assignable to type string[]”
  

Если я изменю подпись с Array<number | string> на Array<number> | Array<string> , также потребуется изменить removeNumbersOrStringsElementsFromArray реализацию, однако с точки зрения JavaScript это работает. Какие-либо другие решения?

Ответ №1:

 function removeNumbersOrStringsElementsFromArray< T extends string | number>(
    targetArray: Array<T>,
    targetElementOrMultipleOfThem: T | Array<T>
): {
    updatedArray: Array<T>;
    removedElementsIndexes: Array<number>;
} {

}

const result: Array<number> = removeNumbersOrStringsElementsFromArray([1, 2, 3, 4], [1, 2]).updatedArray;