typescript - 如何在打字稿中定义接口类型?
问题描述
我想编写一个函数来修改具有特定接口的表单的值。然后我得到字符串不是表单界面键的一部分的错误。如何为该函数定义类型?为什么我不能使用接口作为类型?
interface IForm {
age: number
name: string
job: string
}
// ts 错误:无法将字符串分配给“年龄” | “名字” | “工作”
const setCustom = value => setValue(value, "")
//没有ts错误
const setCustom: (value: "age" | "name" | "job") => void = value => setValue(value, "")
解决方案
您似乎正在寻找keyof
类型运算符,它采用对象类型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"'
推荐阅读
- css - 我如何隐藏从身体溢出的一切?
- python - 暂停 for 循环以等待按钮按下
- dart - 列表添加地图对象
- swiftui - SwiftUI 2 中的 Big Sur 风格侧边栏 Mac Catalyst
- c# - 了解批量插入的 SQL Server 合并问题
- python - 乘以长度为 1 的熊猫系列时出现键错误“0”
- javascript - 在 React 中使用多个异步事件处理状态的策略
- ffmpeg - 将 .mp4 转换为 .mkv 会改变数据保真度吗?
- c# - Unity3D c# 2D Game Camera Follow 正在跳跃
- .net-core - Aspnet Core 3.1 MVC Razor 页面在使用 Identity Server 4 OpenIdConnect 进行身份验证后得到 302