В чем причина того, что TS не позволяет возвращать пустой массив из функции generi c, даже если этот параметр generi c расширяет (имеет ограничение) массив? Результат должен быть получен из массива.
Ниже кода:
// it does not work
async function handleErrors<Result extends Array<any>>(asyncCall: () => Promise<Result>): Promise<Result> {
try {
return await asyncCall();
} catch (e) {
return [];
// return [] as Result; // also does not work - needed casting to `any`/`unknown` first
}
}
Ошибка:
Тип 'never []' не может быть назначен типу 'Result'.
'never []' можно присвоить ограничению типа 'Result', но для 'Result' можно создать другой подтип ограничения 'any []'. (2322)
ИЛИ, если применяемое приведение
Преобразование типа 'never []' в тип "Result" может быть ошибкой, поскольку ни один тип не совпадает в достаточной степени с другим. Если это было сделано намеренно, сначала преобразуйте выражение в «unknown».
«never []» можно назначить ограничению типа «Result», но можно создать экземпляр «Result» с другим подтипом ограничения «any [] '. (2352)
Тип []
равен never[]
.
Я понимаю, что не могу вернуть массив с элементами из этой функции, поскольку точный тип будет выведен из использование (которое еще не известно, в определении функции). Это может быть массив чисел, строк и т. Д. c. поэтому я не могу вернуть, например, массив объектов. Но почему возврат пустого массива не работает?
Является ли причиной того, что возвращаемый тип может быть каким-то типом, который происходит от массива? Так что просто пустой массив не будет иметь некоторые свойства из этого типа, выведенные из использования?
Если я использую отдельный элемент в качестве параметра generi c, то все работает правильно:
async function handleErrors<Element>(asyncCall: () => Promise<Element[]>): Promise<Element[]> {
try {
return await asyncCall();
} catch (e) {
return [];
}
}
Обе версии с примером использования: TS Playground