如何在泛型函数类型中使用可选参数类型?

时间:2018-01-23 20:46:02

标签: typescript generics

我有一个通用的函数类型,如下所示:

type Test<TArg> = (arg: TArg) => void;

大多数情况下,参数由符合此类型的函数使用:

let x1: Test<number> = (n) => { console.log(n) };
let x2: Test<string> = (s) => { alert(s) };

有时候,我有一个不带任何参数的函数:

let y1: Test<undefined> = () => { };

我希望能够调用此函数而不在调用点提供任何参数,如下所示:

y1();

但无论我为TArg插入什么类型,我似乎都无法做到这一点。无论如何,如果不在Test的定义中使参数成为可选项,那么这样做吗?

这是我尝试过的:

type Test<TArg> = (arg: TArg) => void;

let x: Test<number> = (n) => { console.log(n) };
let y1: Test<never> = () => { };
let y2: Test<any> = () => { };
let y3: Test<undefined> = () => { };
let y4: Test<null> = () => { };

x(1);
y1(); //Expected 1 arguments, but got 0.
y2(); //Expected 1 arguments, but got 0.
y3(); //Expected 1 arguments, but got 0.
y4(); //Expected 1 arguments, but got 0.

1 个答案:

答案 0 :(得分:2)

如果有一个执行包装器是可以接受的,我已经提出了一个处理函数长度(0或1)的解决方案,并且对于参数类型是安全的:

RequestContext

请注意,如果您想要将此扩展到1个参数之外,您可以添加其他泛型类型,但是您必须手动定义每个类型并通过包装类进行,但它可以正常工作。

编辑删除了原始的可选参数解决方案