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
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
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.
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>>
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}
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">>
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.
Si vous préférez utiliser une bibliothèque, utilisez ts-essentials.
PS: Vous trouverez beaucoup d'autres choses utiles il ya ;)
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.