有没有一种方法可以从TypeScript中的泛型类型推断出泛型类型?

时间:2020-07-17 01:37:42

标签: typescript generics typescript-generics

我有这个函数useFormState(),它以类型initialValues的对象FormType作为参数。

type FormType = {
    email: string;
    password: string;
    rememberMe: boolean;
}

...

const initialValues: FormType = {
    email: '',
    password: '',
    rememberMe: false,
}

const { values, touched, errors, updateField } = useFormState<FormType, keyof FormType>(initialValues);

函数useFormState()必须返回包含来自FormType的键的对象:

touched: {
    email: true,
    password: false,
    rememberMe: false
}

为了能够像这样键入响应,我需要提取“键”类型,因此我将其作为第二个通用类型keyof FormType传递。

这就是我的问题-有什么方法可以只传递一种类型FormType并在内部提取键类型?

我的功能定义如下:

const useFormer = <T, K extends keyof T>(props) => {
  ...
}

我可以完全省略传递的类型,而让TS来推断类型,这有点奏效,但是

  • 当我使用T添加更多属性时,TS会感到困惑并推断错误
  • 我希望函数的用户确保他们传递的内容与他们拥有的Type相匹配,所以我想我想要一种通用类型。

感觉可以完全推断出第二个K extends keyof T,但是如果我只传递一个类型参数-TS想要第二个。

有什么方法可以摆脱一个吗?

1 个答案:

答案 0 :(得分:1)

findByIdAndUpdate(req.params.id, {
  username = req.body.username,
  description = req.body.description,
  duration = Number(req.body.duration),
  date = Date.parse(req.body.date),
}, 
function(err,docs){
   if(err) console.log(err)
   else console.log("Updated")
})

TS Playground

这样,您不必对keyof使用泛型,而是在函数返回类型接口中对其进行计算。