typescript - 基于键值约束对象的 Typescript 接口
问题描述
我是 Typescript 的新手,一直在玩。我有这段代码出现错误(为简单起见而缩减)。它最终是为了一个 redux 动作/reducer,这就是为什么它有点令人费解。
interface StoreType {
bool: boolean,
num: number,
}
interface PayloadType {
key: keyof StoreType,
value: ???
}
let test: PayloadType = {
key: "bool",
value: 3 // should ideally fail if value is not a boolean
}
var obj: StoreType = { bool: true, num: 3 }
obj[test.key] = test.value // ts(2322) Type 'number' is not assignable to type 'never'
两部分问题:
是否有可能细化
value
为if类型和if类型?我试过了,但没有足够的约束:(PayloadType
test.value
boolean
test.key == "bool"
number
test.key === "num"
value: StoreType[keyof StoreType]
有没有办法使赋值
obj[test.key] = test.value
类型安全且无错误?我在https://github.com/microsoft/TypeScript/issues/31663中看到了错误,但我不确定如何继续,我不知道这是否与问题 1 有关。
如果我错过了一些基本的东西,我不会感到惊讶。
谢谢!
解决方案
key
将类型定义为具有约束PayloadType
的泛型类型参数将起到作用:K
keyof StoreType
interface PayloadType<K extends keyof StoreType> {
key: K,
value: StoreType[K]
}
let test: PayloadType<"bool"> = {
key: "bool",
value: true // ✅
}
let testError: PayloadType<"bool"> = {
key: "bool",
value: 3 //
}
var obj: StoreType = { bool: true, num: 3 }
obj[test.key] = test.value
StoreType[keyof StoreType]
不适用于此示例,因为keyof StoreType
解析为联合类型"bool" | "num"
。查找"bool" | "num"
inStoreType
将解析这些键的所有可能返回类型number | boolean
。
通过将 type 与一起声明key
为泛型类型参数,您表示需要一个特定的键(不是联合)。K
PayloadType<"bool">
StoreType
推荐阅读
- python - 在 Python 中对元组列表进行排序,其中元组是列表
- windows - 无法使用 SSH 连接到服务器,在 Windows 10 中显示“ssh:连接到主机 178.128.60.26 端口 22:连接超时”
- python - 如何使用 Flask-Mail 发送 csv 文件
- javascript - 更改 $_Get 值而不重新加载整个页面内容
- javascript - 查找第一个外部标签内的所有标签
- c - 关于如何为 Linux 字符设备驱动程序设置文件操作的困惑
- java - 在 Windows 上使用 cmd 运行文件
- amazon-web-services - aws ec2 实例和弹性云部署之间的隧道
- redis - 我应该创建多个hiredis对象吗?
- gdb - gdb 运行时错误:找不到文件,溢出错误:int 太大而无法转换