如何提取对象的部分属性键作为联合类型?

How to extract part of the properties' keys of an object as a union type?

在 Typescript 中,我想执行以下操作:

Typescript playground

type MY_OBJECT = {
  fooA: string,
  fooB: string,
  fooD: string,
  fooE: string,
  fooF: string
}

type SOME_PROPS = Extract<keyof MY_OBJECT, "fooA" | "fooB" | "fooC">

我希望 Typescript 能够“知道”keyof MY_OBJECT 上没有可用的 "fooC" 并警告我。

换句话说,我想提取一个对象和一个联合类型的部分属性,并且我想将它们全部保留为强类型。

例如,如果我在 MY_OBJECT 上将 fooA 更改为 fooAAA,我想立即知道我需要修复 Extract<>类型,因为 fooA 将不再存在。

可能吗?

我的用例: 我有一个 Redux 操作,应该更新特定对象的某些属性。因此,我将使用该联合类型(由选定的 属性 名称组成)来键入我的操作并确保该操作仅接收允许的名称。

type MY_OBJECT = {
  fooA: string,
  fooB: string,
  fooD: string,
  fooE: string,
  fooF: string
}

type SOME_PROPS = Extract<keyof MY_OBJECT, "fooA" | "fooB">
type UPDATE_SOME_PROPS  = PayloadAction<{ name: SOME_PROPS , value: SOME_VALUE }>

这是我最后做的事情:

Typescript playground

我正在使用 keyof Pick<>。通过这种方式,您可以获得提取属性的智能感知。

type MY_OBJECT = {
  fooA: string,
  fooB: string,
  fooD: string,
  fooE: string,
  fooF: string
}

type SOME_PROPS = keyof Pick<MY_OBJECT, "fooA" | "fooB">
type SOME_PROPS_TEST = keyof Pick<MY_OBJECT, "fooA" | "fooB" | "fooC">

type SOME_PROPS = keyof Pick<MY_OBJECT, "fooA" | "fooB">                   // WORKS
type SOME_PROPS_TEST = keyof Pick<MY_OBJECT, "fooA" | "fooB" | "fooC">     // TRIGGERS ERROR