Как правильно использовать сопоставленный тип для подписи функции

#typescript #typescript-typings

#typescript #typescript-типизации

Вопрос:

в зависимости от типа параметра я хотел бы ввести возвращаемое значение. Аналогично перегрузке функции, но с использованием сопоставленных типов.

 const requestX = async(
    id?: string | undefined,
): Promise<(typeof id) extends string ? X: X[]> =>
    fetch(......)
 

Однако возвращаемое значение всегда вводится как X[] . Как правильно это сделать?

Комментарии:

1. Перегрузки — это путь сюда. Вы можете заставить это работать с условными типами только тогда, когда указан параметр typescriptlang.org/play ? #code / …

Ответ №1:

Если вы не используете перегрузки, как предложил Алексей Л., вам нужен аргумент универсального типа, в противном typeof id случае он разрешается статически string | undefined , что не помогает в сопоставлении.

Общий пример:

 const requestX = async <ID extends string | undefined = undefined>(id?: ID)
    : Promise<ID extends string ? X : X[]> =>
    fetch(...);
    

const x = requestX() // Promise<X[]>
const y = requestX('123'); // Promise<X>