问题描述
我在这里找到了许多类似的问题,但是找不到我的特定问题。我想要一个泛型,它定义其回调采用的参数的类型,并且“无参数”应该是一个选项。
我不想要的:回调参数是可选的,即在调用回调时可以传递或不传递参数
我想要的是:当我指定通用参数时,我希望能够说回调必须不带任何参数。
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