#typescript #types
#typescript #типы
Вопрос:
Мне интересно, что означает следующее выражение (<T = string>() => Promise<T>)
в следующем контексте:
type Src = string | (<T = string>() => Promise<T>);
И используется в следующей функции:
const handleSource = async (source: Src): Promise<void> => {
if (typeof source === 'string') {
setState((s) => ({ ...s, src: source }));
return;
}
try {
const result = await source();
setState((s) => ({ ...s, src: result }));
} catch (e) {
// eslint-disable-next-line no-console
console.warn('[Image] handleSource', e);
setState((s) => ({ ...s, isLoadingError: true }));
}
};
Ответ №1:
Это означает, что Src
может быть либо
- строка или
- функция, которая принимает общий параметр
T
(который по умолчанию равенstring
) и возвращает обещание, используя этот общий параметр, чтобы сказать, что если обещание выполнено, то это тип, который будет иметь значение выполнения
Так, например, у вас могла бы быть функция, которая выглядела бы так:
function example1(src: Src) {
if (typeof src === "string") {
return src;
}
return src();
}
…это возвращает string
или Promise<string>
или что-то вроде этого:
function example2(src: Src) {
if (typeof src === "string") {
return src;
}
return src<number>();
}
…это возвращает string
или a Promise<number>
(из-за параметра универсального типа при вызове src
).
Комментарии:
1. очень хорошо объяснено!
2. В качестве примечания, похоже, не имеет особого смысла иметь там generic , потому что он не привязан ни к каким аргументам. Возможно, функции было бы лучше вернуть
Promise<unknown>
.