typescript - Typescript键值对到条件对象
问题描述
假设我有一个类型
type MyType = {
'KEY1': 'ValueForKey1';
'KEY2': 'ValueForKey2';
'KEY3': 'ValueForKey3';
}
我有一个函数,它从 MyType 中获取值作为{key: 'KEY1', value: 'ValueForKey1'}
function myFunc(entry: MyParamType<MyType>) {
}
我定义MyParamType
为
type MyParamType<T> = {
key: keyof T;
value: T[keyof T]
};
这适用于
myFunc({
key: 'KEY1',
value: 'ValueForKey1'
})
并按预期失败
myFunc({
key: 'KEY1',
value: 'ValueForKey5' // should fail
})
我面临的问题是它可以取任何键的值而不是那个特定的键所以
myFunc({
key: 'KEY1',
value: 'ValueForKey2'
})
成功而不是失败。
如何添加只有对应键才能成功的条件限制?
游乐场链接。
解决方案
添加第二种类型的参数 - 键 - 将做你想要的。然后你可以使用它来代替T[keyof T]
:
type MyType = {
'KEY1': 'ValueForKey1';
'KEY2': 'ValueForKey2';
'KEY3': 'ValueForKey3';
}
function myFunc<T extends Partial<MyType>, K extends keyof T>(entry: {
key: K,
value: T[K]
}) {
}
// Fails
myFunc({
key: 'KEY1',
value: 'ValueForKey2'
})
// Works
myFunc({
key: 'KEY1',
value: 'ValueForKey1'
})
推荐阅读
- docker - 将 Docker 容器连接到特定的网络接口(例如 eth1)?
- spring - 多个数据源在 Spring Boot 中仅引用一个数据库
- forms - 如何限制用户在sharepoint中提交表单两次?
- java - TimeZone.getTimeZone().getRawOffset() 取决于什么?
- c# - 无需安装程序即可连接到 SQL Server
- python - 尝试使用 MNIST 训练时出现 ResourceExhaustedError
- c# - 使用正则表达式对搜索词进行高级拆分,在词的一部分时尊重连字符和点的规则
- javascript - fast-csv 将不需要的引号添加到数字
- ios - iOS12中以编程方式获取电池信息
- java - 甲骨文的集合