web-dev-qa-db-ja.com

型のプロパティからnullまたは未定義を削除する

プロパティ型から未定義を削除するような型を宣言する必要があります。

次のように仮定します。

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でのみ機能します。

7
Fartab

@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>;
};
0
Stepan