假设我有以下内容:
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
被声明为具有任意字符串键的对象,因此我们无法对对象的实际键(cat
和dog
)进行类型检查。我可以完全删除显式声明,但是然后我不强制这些值是MyValue
。 (在我的实际代码中,MyValue
是几百个常量字符串。)
是否有一种方法(最好不使用包装器函数)来强制值是MyValue
并仍然保持属性类型检查?
答案 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;