プロパティ型から未定義を削除するような型を宣言する必要があります。
次のように仮定します。
type Type1{
prop?: number;
}
type Type2{
prop: number | undefined;
}
type Type3{
prop: number;
}
NoUndefinedField<T>
がNoUndefinedField<Type1>
と同じ型を、Type3
と同じ型を与えるように、NoUndefinedField<Type2>
と呼ばれるジェネリック型を定義する必要があります。
私はこれを試しました
type NoUndefinedField<T> = { [P in keyof T]: Exclude<T[P], null | undefined> };
ただし、これはType2
でのみ機能します。
@Fartabと@ tim.stasseの両方の答えにある何かが、タイプ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)
私は再帰なしでこのソリューションで成功しています:
type NoUndefinedField<T> = {
[P in keyof T]-?: Exclude<T[P], null | undefined>;
};