34857-medium-defined-partial-record

Back

type ValuesOf<T> = T[keyof T];

type Subrecord<U extends PropertyKey, V> = ValuesOf<{
  [Key in U]: Exclude<U, Key> extends ""
    ? never
    : Record<Exclude<U, Key>, V> | Subrecord<Exclude<U, Key>, V>;
}>;

type DefinedPartial<T> =
  T extends Record<infer U, infer V> ? T | Subrecord<U, V> : never;

Solution by NGdre #37979

type DefinedPartial<T, K extends keyof T = keyof T> = K extends unknown ? T | DefinedPartial<Omit<T, K>> : never;

Solution by mxniliuc #37551

type DefinedPartial<T, K extends keyof T = keyof T> = K extends unknown
  ? T | DefinedPartial<Omit<T, K>>
  : never;

Solution by alexandroppolus #35291

type DefinedPartial<T extends Record<PropertyKey, unknown>> = Helper<keyof T, T[keyof T]>

type Helper<K, V, Keys = K> = [K] extends [never]
  ? never
  : Record<K & PropertyKey, V> | (K extends K ? Helper<Exclude<Keys, K>, V> : never)

Solution by Sun79 #35277

type DefinedPartial<T, K = keyof T> = K extends K ? T | DefinedPartial<{[P in Exclude<keyof T, K>]: T[P]}> : never;

Playground

Solution by teamchong #35276