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,但我认为我的问题比这高一个级别。

我该怎么做?

解决方法

我想您正在寻找conditional types

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