【发布时间】:2021-11-30 21:25:45
【问题描述】:
我正在尝试键入一个其属性具有任意名称的配置对象。 每个任意键名都必须有一个值,该值是一个类型化对象,具有一些已定义的属性,该属性具有作为值的父对象的键名之一。
这是我想出的:
//parent type
type ParentType<KeyNames extends string> = {
[k in KeyNames]: ChildType<KeyNames>;
};
//child type
interface ChildType<KeyNames extends string> {
oneOfKeys : KeyNames
}
问题是它的工作方向与我希望的相反。
function testFunc<Keynames extends string>(foo:ParentType<Keynames>){
}
//testFunc is infered as testFunc<"bar" | "baz" | "foo">
//i would like for it to be infered as testFunc<"foo" | "bar" | "bal">
testFunc({
foo: {
oneOfKeys: "bar"
},
bar : {
oneOfKeys: "baz"
},
bal : { //TS is complaining about the "bal" key
oneOfKeys: "foo"
}
})
我希望编译器检查 oneOfkeys 是父对象的键之一,但它检查父键是否是 oneOfKeys 的值之一。 当我希望它自上而下地工作时,就像泛型的推理是自下而上地工作一样。
我尝试了其他各种根本不起作用的方法。
【问题讨论】:
-
能否请您澄清您期望错误的位置以及您不期望的位置。应该验证
oneOfKeys吗? -
@captain-yossarian foo、bar 和 bal 键应该被接受,但 "oneOfKeys" : "baz" 应该被拒绝,因为没有父 "baz" 键。
标签: typescript type-inference typescript-generics