【问题标题】:How to type a variant of a function with no optional arguments - with mapped tuple如何键入没有可选参数的函数变体 - 使用映射元组
【发布时间】:2020-09-07 17:21:16
【问题描述】:

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

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

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 - 这是有道理的,但不是我想要的。

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

【问题讨论】:

    标签: typescript


    【解决方案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

    【讨论】:

    • 太棒了!这解决了我的问题。我仍然不确定为什么我的代码不起作用,但这是次要问题。
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2013-10-09
    • 1970-01-01
    • 2018-11-04
    • 2021-01-12
    • 1970-01-01
    • 2011-04-28
    • 2017-07-03
    相关资源
    最近更新 更多