Typescript 仅强制对象属性的类型脚本

Typescript 仅强制对象属性的类型脚本,typescript,Typescript,假设我有以下几点: constmyobj={foo:'cat',bar:'dog',baz:'bird'}作为const; 键入MyValue=‘鱼’|‘熊’|‘牛’; 常量myValueMap:记录={ [myObj.foo]:“鱼”, [myObj.bar]:“奶牛”, }作为常量; 由于myValueMap被声明为具有任意字符串键的对象,因此我们不会对对象的实际键进行类型检查(cat和dog)。我可以完全删除显式声明,但是我不强制要求值是MyValues。(在我的实际代码中,MyValu

假设我有以下几点:

constmyobj={foo:'cat',bar:'dog',baz:'bird'}作为const;
键入MyValue=‘鱼’|‘熊’|‘牛’;
常量myValueMap:记录={
[myObj.foo]:“鱼”,
[myObj.bar]:“奶牛”,
}作为常量;
由于
myValueMap
被声明为具有任意字符串键的对象,因此我们不会对对象的实际键进行类型检查(
cat
dog
)。我可以完全删除显式声明,但是我不强制要求值是
MyValue
s。(在我的实际代码中,
MyValue
是几百个常量字符串。)

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


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

const myValueMap: Record<myObj[keyof myObj], MyValue> = {
  [myObj.foo]: 'fish',
  [myObj.bar]: 'cow',
};
const myValueMap:记录={
[myObj.foo]:“鱼”,
[myObj.bar]:“奶牛”,
};

可能会使用更多的泛型-

const myValueMap: Record<myObj[keyof myObj], MyValue> = {
  [myObj.foo]: 'fish',
  [myObj.bar]: 'cow',
};
const myValueMap:记录={
[myObj.foo]:“鱼”,
[myObj.bar]:“奶牛”,
};

如果我对您的理解正确,您就可以实现您的要求:

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;
constmyobj={foo:'cat',bar:'dog',baz:'bird'}作为const;
键入MyValue=‘鱼’|‘熊’|‘牛’;
常量myObjValue=myObj[“作为myObj类型的键];
常量myMap:Partial={
[myObj.foo]:“鱼”,
[myObj.bar]:“奶牛”,
}作为常量;

如果我对您的理解正确,您就可以实现您的要求:

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;
constmyobj={foo:'cat',bar:'dog',baz:'bird'}作为const;
键入MyValue=‘鱼’|‘熊’|‘牛’;
常量myObjValue=myObj[“作为myObj类型的键];
常量myMap:Partial={
[myObj.foo]:“鱼”,
[myObj.bar]:“奶牛”,
}作为常量;

不幸的是,这会导致编译错误,因为myValueMap缺少键
myObj.baz
。这基本上是我第一次尝试的。人力资源管理,如果有效,可能使用
Partial
?同样的问题。将
[keyof typeof myObj]
移动到
部分
之外,可能会导致键
未定义
。不幸的是,这会导致编译错误,因为myValueMap缺少键
myObj.baz
。这基本上是我第一次尝试的。人力资源管理,如果有效,可能使用
Partial
?同样的问题。将
[keyof typeof myObj]
移动到
部分
之外,可能会导致密钥
未定义