Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何使用类型参数调用const函数?_Typescript_Typescript Typings_Redux Form - Fatal编程技术网

Typescript 如何使用类型参数调用const函数?

Typescript 如何使用类型参数调用const函数?,typescript,typescript-typings,redux-form,Typescript,Typescript Typings,Redux Form,根据redux表单中的定义: 我可以为const函数指定泛型参数吗 打字错误吗?如何纠正 更新:这种情况下的打字不正确。而不是 export type DataSelector<FormData = {}, State = {}> = (formName: string, getFormState?: GetFormState) => (state: State) => FormData; PR opened:这里的问题是getFormValues不是一个通用函数,因此

根据
redux表单中的定义

  • 我可以为
    const
    函数指定泛型参数吗
  • 打字错误吗?如何纠正
  • 更新:这种情况下的打字不正确。而不是

    export type DataSelector<FormData = {}, State = {}> = (formName: string, getFormState?: GetFormState) => (state: State) => FormData;
    

    PR opened:

    这里的问题是
    getFormValues
    不是一个通用函数,因此没有直接的方法将其用于您的目的。类型
    DataSelector
    DataSelector
    相同,因为
    DataSelector
    的定义使用。因此,
    getFormValues
    基本上具有以下类型:

    declare const getFormValues: (
      formName: string, getFormState?: GetFormState
    ) => (state: {}) => {};
    
    那里再也没有通用的东西了。如果调用
    getFormValues()
    它将返回类型为
    (状态:{})=>{}
    的函数,该函数接受(几乎)任何内容并返回
    {}
    ,这是一种没有已知属性的对象类型


    我不确定
    DataSelector
    的预期用途是什么,也不确定
    getFormValues()
    是如何实现的,因此下面是我可能用于获取适用于特定示例代码的输入

    如果希望
    getFormValues
    本身是一个泛型函数,则需要将泛型类型参数从
    DataSelector
    类型声明移到调用签名上,如下所示:

    type GenericDataSelector = <FormData = {}, State = {}>(
      formName: string, getFormState?: GetFormState
    ) => (state: State) => FormData;
    
    我认为,这会给你想要的行为:

    const nameOkay = getFormValuesGeneric<FormFields>('my-form')(state).name;
    
    const-nameook=getFormValuesGeneric('my-form')(state).name;
    

    这是可行的,尽管我对没有类型参数推断站点的泛型函数有点怀疑。
    GenericDataSelector
    类型的调用签名在两个参数中是泛型的,这两个参数都不出现在调用签名的参数中。。。它们仅出现在返回类型中

    这意味着如果我调用
    getFormValuesGeneric(“某物”)
    ,编译器不知道如何推断
    状态和
    FormData
    应该是什么,它最终默认为
    {}
    {}
    。如果您想要不同的东西,您需要手动指定它,比如
    getFormValuesGeneric(“某物”)

    这是可行的,但你最终会陷入一种奇怪的境地,说
    getFormValuesGeneric(“某物”)
    返回类型为
    (State1)=>FormData1
    的函数,而
    getFormValuesGeneric(“某物”)
    返回类型为
    (State2)=>FormData2
    的函数。当然,在运行时,类型系统是,所以这两个都是
    getFormValuesGeneric(“某物”)
    。两个相同的调用如何返回两个不同的函数类型,它们依赖于已擦除的内容?他们不能,真的

    这意味着对于
    getFormValuesGeneric(“某物”)
    ,最多只能选择一个
    。。。我想,选择正确的函数是编写调用函数的TS代码的人的责任。但在这种情况下,这和使用(你称之为“cast”)没有太大区别;它们都不能保证任何类型的安全

    传入的
    formName
    参数的值与
    FormData
    State
    的正确规范之间可能存在某种关系,但编译器不知道这一点。可以想象重写这些类型,以便编译器能够跟踪这个映射,但是我认为这超出了这个问题的范围。

    所有这些的好处都是在使用无法从任何东西合理推断其参数的泛型函数时要小心


    非常感谢--您不能为常量函数指定类型参数--它一直在使用其类型的默认类型参数。所以打字是错误的。为了回答您的问题并提供一些信息,最终用户应该是向
    getFormValues
    提供打字信息的人,如果他们希望提供这些信息的话。表单名称与
    FormData
    之间没有任何联系。我不确定“不能为常量函数指定类型参数”是否正确。在我上面的回答中,
    getFormValuesGeneric
    是一个“
    const
    函数”,但它是泛型的,您可以指定它的类型参数。除非你是说“常量函数”。我会说“不能为非泛型函数指定类型参数”。对不起——是的,我明白你的意思。根据您的建议,我通过更改声明
    export-type-DataSelector=(…)=>,修复了键入(作为测试)
    导出类型DataSelector=(
    )(将泛型类型移到
    =
    的右侧。我将为键入启动一个PR,再次感谢!
    const name = getFormValues<FormFields>('my-form')(state)?.name;
    
    declare const getFormValues: (
      formName: string, getFormState?: GetFormState
    ) => (state: {}) => {};
    
    type GenericDataSelector = <FormData = {}, State = {}>(
      formName: string, getFormState?: GetFormState
    ) => (state: State) => FormData;
    
    const getFormValuesGeneric = getFormValues as GenericDataSelector;
    
    const nameOkay = getFormValuesGeneric<FormFields>('my-form')(state).name;