#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