Typescript: Ta bort snittypen från huvudtypen


Jag är ny på Typescript och fast på det här problemet. Så, jag har en typ definierad som:

type MainType = Node & {
  id: string;
  name: string;
  notifications: number
}

Jag vill ha en typ som inte innehåller Node-typ.

//Expected type
 {
  id: string;
  name: string;
  notifications: number
 }


// I tried using Exclude, but it returns never
type SecondaryType = Exclude<MainType, Node>

//I tried using Omit, but that doesn't allow me to pass Node
type SecondaryType = Omit<MainType, Node>

Svar #1

Du behöver utelämna alla nycklar från Node-typen:

type SecondaryType = Omit<MainType, keyof Node>

Kolla denna lekplatslänk

Svar #2

För en mer generell lösning som fungerar i alla fall, kolla in detta knep:

type Untag<T, Tag> =
  T extends infer T & Tag ? T : never;

type TestResult = Untag<string & { _tag: "foo" }, { _tag: "foo" }>; // => string

Detta görs möjligt av TypeScripts speciella stöd för inferens av intersection-typer i generiska typer, vilket tillåter funktioner som untag<T>(a: T & { tag: any }): T att fungera.

Relaterade artiklar