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类型系统通常不是为此任务构建的。但这是一个很好的解决方案。有两件事:1
      createT
      不限制
      obj
      。也就是说,它可以合法地保存比
      T
      (TE extends T)指定的更多的信息-对于我的用例来说,这是合理的。2.显然,obj在被馈送到
      createT
      之前应该是显式类型的,例如
      v:T=;t=t(v)(我第一次尝试迁移此解决方案时就遇到了此问题)3。
      obj
      上的错误显示得不漂亮。但对我来说,这也是可以接受的。