如何在打字稿中定义接口类型?

时间:2021-01-29 15:46:10

标签: typescript react-hook-form

我想编写一个函数来修改具有特定接口的表单的值。然后我得到字符串不是表单界面键的一部分的错误。如何为该函数定义类型?为什么我不能使用接口作为类型?

sandbox

interface IForm {
   age: number
   name: string
   job: string
}

// ts 错误:无法将字符串分配给“age” | "姓名" | “工作”

const setCustom = value => setValue(value, "")

//没有ts错误

const setCustom: (value: "age" | "name" | "job") => void = value => setValue(value, "")

2 个答案:

答案 0 :(得分:0)

您似乎正在寻找 keyof type operator,它采用像 IForm 这样的对象类型并生成其键的联合:

type KeyofIform = keyof IForm;
// type KeyofIform = "age" | "name" | "job"

因此,在您手动指定 "age" | "name" | "job" 的任何地方,您都可以使用 keyof IForm,它是等效的,并且会在 IForm 的定义发生更改时自动更改:

const setCustom: (value: keyof IForm) => void = value => setValue(value, "")
// const setCustom: (value: keyof IForm) => void

setCustom("age"); // okay
setCustom("name"); // okay
setCustom("job"); // okay
setCustom("shoeSize"); // error!
// Argument of type '"shoeSize"' is not assignable 
// to parameter of type '"age" | "name" | "job"'

Playground link to code

答案 1 :(得分:-2)

你需要把;在每个变量的末尾:

interface IForm {
   age?: number;
   name?: string;
   job?: string;
}