typescript中的最小抽象类型
我经常使用以下结构:typescript中的最小抽象类型,typescript,types,Typescript,Types,我经常使用以下结构: const v = { a: "string1", b: "string2", c: "string3" } const x: keyof typeof v = "a" 帮助库的用户并让编辑器显示可能的版本 在上面的例子中,如果v接收到显式类型{a:string,b:string,c:string},这将停止工作,因为typeof解析为更通用的类型,并且不再将单个键视为该类型的一
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"
}
}
我的目标是制作一个签名常数f:(a:keyof TE[“a”])=>布尔值的函数,该函数识别TE
和T
的最小抽象类型。即
f(“a3”)
应导致类型错误
f(“a2”)
不应导致类型错误
我也在找同样的东西。我找到的唯一解决方案是使用factory函数:
类型T={
a:{
[p:string]:字符串
}
b:{
[p:string]:字符串
}
}
函数createT(对象:TE):TE{
返回obj;
}
常数t=createT({
a:{
a1:“n”,
a2:“n”
},
b:{
b1:“n”,
b2:“n”
}
});
TE型=t型;
常数f:(a:keyofte[“a”])=>boolean=()=>true;
f('a1');
Hi,v
的类型已经是{a:string,b:string,c:string}
。请添加一个示例,其中类型失败,正如您在中所说,这将停止工作,因为typeof解析为这个更通用的类型,并且不再将单个键视为类型的一部分。
只需从T
的声明中删除注释T
。它所做的只是删除您要保留的类型信息。@AluanHaddad我刚刚澄清,我无法删除我要从中提取键的对象的注释,因为其中有几个键,我需要在其中键入。否则,{…}as const
就是我想要的。@ShivamSingla我添加了一个例子,说明什么应该和不应该使程序中断。聪明,谢谢!显然,typescript类型系统通常不是为此任务构建的。但这是一个很好的解决方案。有两件事:1createT
不限制obj
。也就是说,它可以合法地保存比T
(TE extends T)指定的更多的信息-对于我的用例来说,这是合理的。2.显然,obj在被馈送到createT
之前应该是显式类型的,例如v:T=;t=t(v)代码>(我第一次尝试迁移此解决方案时就遇到了此问题)3。obj
上的错误显示得不漂亮。但对我来说,这也是可以接受的。