如何键入不带可选参数的函数的变体-映射元组

时间:2020-09-07 08:02:34

标签: typescript

我尝试为具有与源函数完全相同的参数的函数进行键入,但是其中没有一个是可选的。

我尝试根据逻辑使用映射元组:

type IFArgs = ArgsN<typeof getFunc>
type IMappedIFArgs = {[N in keyof IFArgs]-?: IFArgs[N]} // The -? removes "optionality"
const getFuncMandatory = <(...args: IMappedIFArgs) => string>getFunc // Error: IMappedIFArgs not a tuple...

ArgsN来自tsargs库的地方,并且被这样巧妙地定义:

export type ArgsN<T extends (...args: any[]) => any> = T extends (...args: infer K) => any ? K : never;

根据3.1文档,当源是元组时,映射类型也应该是元组。在VS Code中进行检查时,似乎几乎是这种情况-但距离编译器尚不足以使其接受为参数。另外,映射类型的长度返回2 | 3,而不是3-这很有意义,但不是我想要的。

任何想法如何使映射的元组成为有效的参数元组?关于如何使用其他机制将其存档的任何想法也将很好。

1 个答案:

答案 0 :(得分:1)

您定义的一些类型已经在TypeScript中存在。

我还没有研究这里发生的事情和你所拥有的事情之间的区别,但这似乎行得通:

function getFunc(n:number,s?:string):void{}
type IFArgs = Parameters<typeof getFunc>
type IMappedIFArgs = Required<IFArgs>

const getFuncMandatory = getFunc as ((...args: IMappedIFArgs) => string)

请参阅以下类型的定义以与您自己的实现进行比较:ParametersRequired