首页 > 解决方案 > 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'
})

成功而不是失败。

如何添加只有对应键才能成功的条件限制?

游乐场链接

标签: typescripttypescript-typingstypescript-generics

解决方案


添加第二种类型的参数 - 键 - 将做你想要的。然后你可以使用它来代替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'
})

推荐阅读