Тип машинописного текста RequireSome <T, K расширяет ключ T>, удаляя неопределенные значения И нуль из свойств - PullRequest
0 голосов
/ 15 апреля 2019

RequireSome типа из другого, очень схожего вопроса.Этот вопрос похож, но он не должен быть дубликатом, поскольку здесь мы хотим, чтобы также удалял из свойств как null , так и undefined.

Возможно, имя не должно быть Require, а что-то вроде NonNullableили такого рода.Цель этого типа - указать, какие поля из типа не должны быть неопределенными или нулевыми, и возвращать их типы без неопределенных и нулевых.

type Question = {
    id: string;
    answer?: string | null;
    thirdProp?: number | null;
    fourthProp?: number | null;
}

// usage NonNullable<Question, 'answer' | 'thirdProp'> expect to equal
/*

type Question = {
    id: string; // no changes
    answer: string; // changed
    thirdProp: number; // changed
    fourthProp?: number | null; // no changes
}

*/

1 Ответ

1 голос
/ 15 апреля 2019

Упрощенный подход, который просто пересекается с T с Required<Pick<T, K>> с обязательной частью, в основном переопределяющей необязательные свойства в T, не будет работать здесь.(Между прочим, это работает, потому что { foo?: X } & { foo: X } по существу { foo: X })

Чтобы также удалить Nullability, мы должны сначала создать тип, который удалил null и undefined из данного типа T (аналогичнодо Required).Затем нам нужно пересечь свойства, которые мы хотим сделать обязательными, а не нулевые с остальными ключами в T, используя тип Omit.

type Omit<T, K> = Pick<T, Exclude<keyof T, K>> // not needed in ts 3.5

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

type RequireAndNotNullSome<T, K extends keyof T> = 
    RequiredAndNotNull<Pick<T, K>> & Omit<T, K>

type Question = {
    id: string;
    answer?: string | null;
    thirdProp?: number | null;
    fourthProp?: number | null;
}

type T0 = RequireAndNotNullSome<Question, 'answer' | 'thirdProp'> 
...