条件对象的打字稿键值对

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
}

定义两个泛型类型 KV,其中 V 扩展 MyType[K],即值对应于键。

playground