条件对象的打字稿键值对
Typescript key value pair to conditional object
假设我有一个类型
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'
})
成功而不是失败。
如何添加只有相应的键才能成功的条件限制?
游乐场link.
添加第二个类型的参数 - 键 - 会做你想做的。然后你可以用它代替 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'
})
您可以将您的方法定义为:
function myFunc<K extends keyof MyType, V extends MyType[K]>(
entry: {key: K, value: V}) {
// function body
}
定义两个泛型类型 K
和 V
,其中 V
扩展 MyType[K]
,即值对应于键。
假设我有一个类型
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'
})
成功而不是失败。
如何添加只有相应的键才能成功的条件限制?
游乐场link.
添加第二个类型的参数 - 键 - 会做你想做的。然后你可以用它代替 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'
})
您可以将您的方法定义为:
function myFunc<K extends keyof MyType, V extends MyType[K]>(
entry: {key: K, value: V}) {
// function body
}
定义两个泛型类型 K
和 V
,其中 V
扩展 MyType[K]
,即值对应于键。