Nu pot crea tipuri TypeScript corecte pentru a aplica utilitarul Partial la o intersecție între un tip simplu și un tip generic


Vreau să înțeleg cum funcționează o intersecție atunci când este necesar să folosim Partial. Acesta este folosit pentru setStatePartialHook atunci când tipul exact al stării este necunoscut.

type ModorkParams = {
  clientSessionId: string;
};

type Config<T extends Record<string, string>> = ModorkParams & Omit<T,'clientSessionId'>;


const foo = <T extends Record<string, string> = {}>() => { 
  let t: Partial<Config<T>> = { clientSessionId: "fdfdf" }; // Type '{ clientSessionId: "fdfdf"; }' is not assignable to type 'Partial<Config<T>>'.(2322)
  console.log(t);
};

De ce Partial nu ia în considerare Omit?

type ModorkParams = {
  clientSessionId: string;
};

type Config<T extends {
  clientSessionId?: string;
}> = ModorkParams & T;

Afișează aceeași eroare.

Răspuns #1

Nu poți omite un tip literal din tipul său generic, așa cum nu poți face Exclude<string, 'clientSessionId'>, acesta ar da oricum string, deci omiterea Record<string,string> nu funcționează, dar TS încearcă să facă ceva lucru și deduce T la inițializare ca Omit<T, 'clientSessionId'>, care este respins din cauza prezenței clientSessionId în literalul de obiect. Per ansamblu, întregul construct pare supra-complicat având în vedere absența întregului ciclu de viață al variabilei t și tiparea redundantă la inițializarea variabilei.

O alternativă mai simplă ar fi

type ModorkParams = {
  clientSessionId: string;
};

type Config = ModorkParams & Record<string, string>;

const foo = () => { 
  let t: Config = { clientSessionId: 'asdf' };
  console.log(t);
};