如何解决Typescript将函数参数与类型映射的键和值匹配
我有一个非常简单的案例,但是我在打字稿打字方面的经验有限,我似乎无法解决这个看似简单的案例。
interface keyvalueMap {
key: 'value';
foo: 'bar';
}
现在,我想在上面的映射的键和值中键入函数的第一个和第二个参数
const test = <K extends keyof keyvalueMap>(key: K,value: keyvalueMap[K]) => {
switch (key) {
case 'key':
return value; // currently getting "keyvalueMap[K]" expecting "value"
case 'foo':
return value; // currently getting "keyvalueMap[K]" expecting "bar"
}
};
我试图搜索类似的案件,但是我的Google似乎坏了... 因此,如果Stackoverflow上已经存在这样的示例,则将其标记为重复时不会冒犯。
更新
@ShivamSingla在我的问题下发表评论后,我意识到我可能对问题的理解不够清楚。我对函数的返回值不感兴趣,但是已经希望在实际的函数逻辑中(在切换情况下)识别类型。我将更改示例以使其更加清晰:
interface KeyObjectMap {
foo: {
key1: 'value1';
};
bar: {
key2: 'value2';
};
}
const test = <K extends keyof KeyObjectMap>(key: K,value: KeyObjectMap[K]) => {
switch (key) {
case 'foo':
return value.key1; // property 'key1' does not exist on 'KeyObjectMap[K]'
case 'bar':
return value.key2; // property 'key2' does not exist on 'KeyObjectMap[K]'
}
};
Here you can find a Playground with this example
解决方法
由于key
和value
未关联,因此可以在切换大小写之前重新分配值。这就是错误的原因。请参阅this答案以获得更好的理解。
interface KeyObjectMap {
foo: {
key1: 'value1';
};
bar: {
key2: 'value2';
};
}
type K1 = keyof KeyObjectMap
const test = <K extends K1 = K1>(key: K,value: KeyObjectMap[K]) => {
// error here,'key2' is missing
value = {
key1: 'value1',}
// value is actually intersection,subtype `KeyObjectMap` actually
value = {
key1: 'value1',key2: 'value2',}
// since `key` and `value` are not associated,value can be re-assigned
// before switch case. That's why the error
switch (key) {
case 'foo':
return value.key1; // property 'key1' does not exist on 'KeyObjectMap[K]'
case 'bar':
return value.key2; // property 'key2' does not exist on 'KeyObjectMap[K]'
}
};
可能的解决方案
interface KeyObjectMap {
foo: {
key1: 'value1';
};
bar: {
key2: 'value2';
};
}
const test = <O extends Partial<KeyObjectMap>>(obj: O) => {
if (obj.foo) {
return obj.foo.key1
}
if (obj.bar) {
return obj.bar.key2
}
return undefined
};
// calling
const c = test({foo: {key1: 'value1'}})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。