打字稿中最不抽象的类型

时间:2021-02-17 08:34:49

标签: typescript types

我经常使用以下结构:

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 的函数,该函数能够识别最不抽象的 TET 类型。即。

  • f("a3") 应该导致类型错误
  • f("a2") 不应导致类型错误。

1 个答案:

答案 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');

Playground link