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;