仅强制对象属性的TypeScript类型

时间:2020-08-12 17:42:58

标签: typescript

假设我有以下内容:

const myObj = { foo: 'cat', bar: 'dog', baz: 'bird' } as const;

type MyValue = 'fish' | 'bear' | 'cow';

const myValueMap: Record<string, MyValue> = {
  [myObj.foo]: 'fish',
  [myObj.bar]: 'cow',
} as const;

由于myValueMap被声明为具有任意字符串键的对象,因此我们无法对对象的实际键(catdog)进行类型检查。我可以完全删除显式声明,但是然后我不强制这些值是MyValue。 (在我的实际代码中,MyValue是几百个常量字符串。)

是否有一种方法(最好不使用包装器函数)来强制值是MyValue并仍然保持属性类型检查?

TS Playground

2 个答案:

答案 0 :(得分:0)

也许可以使用更多的泛型-

const myValueMap: Record<myObj[keyof myObj], MyValue> = {
  [myObj.foo]: 'fish',
  [myObj.bar]: 'cow',
};

答案 1 :(得分:0)

如果我对您的理解正确,那就可以满足您的要求:

const myObj = { foo: 'cat', bar: 'dog', baz: 'bird' } as const;

type MyValue = 'fish' | 'bear' | 'cow';

const myObjValue = myObj["" as keyof typeof myObj];

const myMap: Partial<Record<typeof myObjValue, MyValue>> = {
  [myObj.foo]: 'fish',
  [myObj.bar]: 'cow',
} as const;