471 votes

Exclure la propriété du type

J'aimerais exclure une seule propriété du type. Comment puis-je faire cela?

Par exemple, j'ai

Et je veux exclure la propri `` été pour obtenir

800voto

CRice Points 15212

Pour les versions de la Machine à ou au-dessus de 3,5

En caractères d'imprimerie 3.5, l' Omit type a été ajouté à la bibliothèque standard. Voir les exemples ci-dessous pour savoir comment l'utiliser.

Pour les versions de la Machine en dessous de 3,5

En caractères d'imprimerie 2.8, l' Exclude type a été ajouté à la bibliothèque standard, qui permet une omission type à être écrit simplement:

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>

Pour les versions de caractères d'imprimerie ci-dessous 2.8

Vous ne pouvez pas utiliser l' Exclude type dans les versions 2.8 ci-dessous, mais vous pouvez créer un remplacement pour elle afin d'utiliser le même type de définition que ci-dessus. Toutefois, ce remplacement ne fonctionne que pour les types de chaînes, de sorte qu'il n'est pas aussi puissant que l' Exclude.

// Functionally the same as Exclude, but for strings only.
type Diff<T extends string, U extends string> = ({[P in T]: P } & {[P in U]: never } & { [x: string]: never })[T]
type Omit<T, K extends keyof T> = Pick<T, Diff<keyof T, K>>

Et un exemple de ce type en cours d'utilisation:

interface Test {
    a: string;
    b: number;
    c: boolean;
}

// Omit a single property:
type OmitA = Omit<Test, "a">; // Equivalent to: {b: number, c: boolean}

// Or, to omit multiple properties:
type OmitAB = Omit<Test, "a"|"b">; // Equivalent to: {c: boolean}

55voto

Jason Hoetger Points 3214

Avec tapuscrit 2.8, vous pouvez utiliser le nouveau bâti-en Exclude type. La version 2.8 de notes en fait mention dans la section "Prédéfinis conditionnelle types":

Remarque: L'Exclure type est une bonne mise en œuvre de la Diff de type suggéré ici. [...] Nous n'avons pas inclus les Omettre type car il est trivialement écrit comme Pick<T, Exclude<keyof T, K>>.

En appliquant cela à votre exemple, de type XY pourrait être définie comme:

type XY = Pick<XYZ, Exclude<keyof XYZ, "z">>

31voto

Qwertiy Points 6707

J'ai trouvé la solution avec de déclarer certaines variables et l'utilisation de la propagation de l'opérateur de déduire de type:

interface XYZ {
  x: number;
  y: number;
  z: number;
}

declare var { z, ...xy }: XYZ;

type XY = typeof xy; // { x: number; y: number; }

Cela fonctionne, mais je serais heureux de voir une meilleure solution.

9voto

krzKaczor Points 576

Si vous préférez utiliser une bibliothèque, utilisez ts-essentials.

PS: Vous trouverez beaucoup d'autres choses utiles il ya ;)

5voto

GonchuB Points 675
<h1>Typescript 3.5</h1> <p>À partir de Typescript 3.5, l'aide Omit sera inclus: <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-3-5-rc/#the-omit-helper-type" rel="nofollow noreferrer">TypeScript 3.5 RC - The Omit Helper Type</a></p> <p>Vous pouvez l'utiliser directement, et vous devez supprimer votre propre définition de l'aide Omit lors de la mise à jour.</p>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X