web-dev-qa-db-fra.com

supprimer null ou indéfini des propriétés d'un type

J'ai besoin de déclarer un type tel que supprime l'indéfini de ses types de propriété.

Supposons que nous ayons:

type Type1{
  prop?: number;
}

type Type2{
  prop: number | undefined;
}

type Type3{
  prop: number;
}

J'ai besoin de définir un type générique appelé NoUndefinedField<T> tel que NoUndefinedField<Type1> donne le même type que Type3 et du même type que NoUndefinedField<Type2>.

J'ai essayé

type NoUndefinedField<T> = { [P in keyof T]: Exclude<T[P], null | undefined> };

Mais cela ne fonctionne que pour Type2.

7
Fartab

Quelque chose dans les réponses de @ Fartab et de @ tim.stasse me gâche une propriété de type Date:

// both:
type NoUndefinedField<T> = {
  [P in keyof T]-?: NoUndefinedField<NonNullable<T[P]>>;
};
type NoUndefinedField<T> = {
  [P in keyof T]-?: NoUndefinedField<Exclude<T[P], null | undefined>>;
};
// throw:
Property '[Symbol.toPrimitive]' is missing in type 'NoUndefinedField<Date>' but required in type 'Date'.ts(2345)
// and
type NoUndefinedField<T> = { [P in keyof T]: Required<NonNullable<T[P]>> };
// throws:
Property '[Symbol.toPrimitive]' is missing in type 'Required<Date>' but required in type 'Date'.ts(2345)

J'ai du succès avec cette solution sans récursivité:

type NoUndefinedField<T> = {
  [P in keyof T]-?: Exclude<T[P], null | undefined>;
};
0
Stepan