Что означает следующее выражение машинописи?

#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> .