Упрощенный подход, который просто пересекается с 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'>