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
.
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>;
};