【发布时间】:2022-04-17 03:31:41
【问题描述】:
我有一个稍微复杂的对象,它在对象的最顶层以及对象的最深层都有键入的键,我似乎无法索引第二个键入的键对象。
这是我的对象和我的接口(简化):
const obj = {
keyA: {
variants: {
"0": false,
"1": false
}
},
keyB: {
variants: {
"0-0": false,
"0-1": false
}
}
}
type Obj = typeof obj;
type ObjKeys = keyof Obj;
type ObjVariants<T extends ObjKeys> = Obj[T]["variants"];
这是无法使用 defaultVariant 正确索引 selectedKeys.variant 的函数。
function getVariant<T extends ObjKeys>(key: T, defaultVariant: keyof ObjVariants<T>) {
const selectedKey = obj[key];
const selectedVariant = selectedKey.variants[defaultVariant];
}
我得到的错误是:
Type 'keyof { keyA: { variants: { 0: boolean; 1: boolean; }; }; keyB: { variants: { "0-0": boolean; "0-1": boolean; }; }; }[T]["variants"]' cannot be used to index type '{ 0: boolean; 1: boolean; } | { "0-0": boolean; "0-1": boolean; }'.(2536)
好像和这两个问题有关:https://github.com/microsoft/TypeScript/issues/21760和https://github.com/microsoft/TypeScript/issues/36631 但我不确定第二个的“解决方法”是否适合我,我觉得我错过了一些东西
有没有其他人遇到过类似的情况/有建议的解决方法?
PD:我尝试将严格类型添加到 obj 并发现与使用 typeof obj 相同的结果。
【问题讨论】:
-
"T extends ObjKeys" 并不意味着 T 可以是 "keyA" XOR "keyB": T 也可以是 "keyA"|"keyB" 因为 "keyA "|"keyB" 实际上扩展了 ObjKeys。
标签: javascript typescript typescript-typings