TypeScript: введите с обратным вызовом с необязательным параметром общего назначения

#typescript #generics #callback #optional-parameters

#typescript #дженерики #обратный вызов #необязательно-параметры

Вопрос:

Я нашел здесь много похожих вопросов, но я не смог найти свою конкретную проблему. Я хочу иметь общий тип, который определяет тип параметра, который принимает его обратный вызов, и «без параметра» должен быть параметром.

Чего я не хочу: параметр обратного вызова должен быть необязательным в том смысле, что при вызове обратного вызова параметр может быть передан или нет

Что я хочу: когда я указываю общий параметр, я хочу иметь возможность сказать, что обратный вызов не должен принимать никаких аргументов.

 type Caller<T> = (
    callback: (params:T)=>void
) => void

// none of this works:

let caller1:Caller<void> = function(
    callback: ()=>void
){}

let caller2:Caller<never> = function(
    callback: ()=>void
){}

let caller3:Caller<undefined> = function(
    callback: ()=>void
){}

// this works-ish but is ugly:

let caller4:Caller<void> = function(
    callback: (_:void)=>void
){}
  

Я также прочитал это https://www.typescriptlang.org/docs/handbook/declaration-files/do-s-and-don-ts.html но я думаю, что моя проблема на один уровень выше этой.

Как я могу это сделать?

Ответ №1:

Я полагаю, вы ищете условные типы:

 type Caller<T> = (
    callback: T extends void ? () => void : (params: T) => void
) => void