我尝试为具有与源函数完全相同的参数的函数进行键入,但是其中没有一个是可选的。
我尝试根据逻辑使用映射元组:
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
-这很有意义,但不是我想要的。
任何想法如何使映射的元组成为有效的参数元组?关于如何使用其他机制将其存档的任何想法也将很好。
答案 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)
请参阅以下类型的定义以与您自己的实现进行比较:Parameters
,Required