我经常使用以下结构:
const v = {
a: "string1",
b: "string2",
c: "string3"
}
const x: keyof typeof v = "a"
帮助库用户并让编辑器显示可能的版本。
在上面,如果 v
收到显式类型 {a: string, b: string, c: string}
,这将停止工作,因为 typeof
解析为这种更通用的类型,并且不会将单个键视为再打字。
但是,我希望能够在类型 下输入 v
并 提取所述值的键。这里的原因是 v 是一个大而复杂的对象,有几个化身。
有没有办法绕过这个,这样我就可以输入 v 并提取具体对象的键?
具体来说,我有以下类型的值
type T = {
a: {
[p: string]: string
}
b: {
[p: string]: string
}
}
带值:
const t: T = {
a: {
a1: "n1",
a2: "n2"
},
b: {
b1: "m1",
b2: "m2"
}
}
我的目标是创建一个签名为 const f: <TE extends T>(a: keyof TE["a"]) => boolean
的函数,该函数能够识别最不抽象的 TE
和 T
类型。即。
f("a3")
应该导致类型错误f("a2")
不应导致类型错误。答案 0 :(得分:1)
我一直在寻找同样的东西。我找到的唯一解决方案是使用工厂函数:
type T = {
a: {
[p: string]: string
}
b: {
[p: string]: string
}
}
function createT<TE extends T>(obj: TE): TE {
return obj;
}
const t = createT({
a: {
a1: "n",
a2: "n"
},
b: {
b1: "n",
b2: "n"
}
});
type TE = typeof t;
const f: (a: keyof TE["a"]) => boolean = () => true;
f('a1');