У меня есть функция, параметр которой может быть либо пустым массивом, либо массивом со строками.
Поэтому я решаю это с помощью типа union [] | string[]
Затем внутри функции я проверяю, имеет ли значение array.length > 0, и если да, то я сопоставляю этот параметр.
type Kennel = [] | string[]
const petDogs = (kennel: Kennel) => {
if (kennel.length > 0){
return kennel.map((name:string)=>name)
} else {
return "no doggies to pet"
}
}
Однако при компиляции получаю ошибку
Cannot invoke an expression whose type lacks a call signature. Type '(<U>(callbackfn: (value: never, index: number, array: never[]) => U, thisArg?: any) => U[]) | (<U>(callbackfn: (value: string, index: number, array: string[]) => U, thisArg?: any) => U[])' has no compatible call signatures
Я пытался использовать перегрузку функций, но это не решило ошибку компиляции.
пример:
interface PetDogs {
(kennel: []): string;
(kennel: string[]): string[];
}
На самом деле это недостаток дизайна в базовой реализации TypeScript, если вам интересно, вы можете читайте об этом здесь, но объединения с несколькими типами массивов всегда вызывают эту ошибку на Array.map
afaik. jcalz прав, вам не нужно использовать [] | string[]
, string[]
достаточно конкретен
[]
— это тип кортежа, предназначенный для другого варианта использования. string[]
— это тип массива, а пустой массив по-прежнему является типом string[]
. Ваш код будет работать без ошибок компиляции:
type Kennel = string[]
const petDogs = (kennel: Kennel) => {
if (kennel.length > 0){
return kennel.map((name:string)=>name)
} else {
return "no doggies to pet"
}
}
petDogs([]);
petDogs(["Fido", "Doggo"]);
Почему бы не просто
string[]
? Пустой массив является допустимымstring[]
. Вам не нужно упоминать нулевой кортеж, если у вас нет другого варианта использования.