javascript - Typescript: provjerite jesu li ključevi Type objekata samo jedan od K i jedno par ključ:vrijednost


Imam sljedeći kod, koji mi daje ts(1337) pogrešku:

type Options = 'option1' | 'option2' | 'option3'

type ComplexValue = { [key: Options]: string } // ts error 1337

Ono što želim postići ovdje je da ključevi objekata ComplexValue mogu biti samo jedan od Options.

ako pokušam popraviti i definirati to drugačije jednim od dolje navedenih opcija:

type ComplexValue = { [K in Options]: string }

// or simply

type ComplexValue = Record<ServerFilterOperator, string>

i onda pokušavajući napisati nešto poput ovoga

const something: ComplexValue = { option1: 'ziv' }

onda dobivam sljedeću pogrešku Type ''{ [x: string]: string; }'' nedostaju sljedeća svojstva iz tipa ''ComplexValue'': option2, option3.ts(2740)

Rješenje koje mogu primijeniti je dodavanje ? u definiciju type ComplexValue={ [key in Options]?: string } - ovo će primijeniti da su svi ključevi opcionalni. Ali zapravo želim provjeriti samo da je proslijeđen jedan key:value.

Koji je ispravan način da se provjeri da ključevi objekata ComplexValue mogu biti samo jedan od Options i da na objektu postoji samo jedan key:value par?

link na TS igralište je ovdje

Odgovor #1

Pomalo je nezgodno, ali možete to obaviti. Inspiriran nekoliko drugih odgovora, smislio sam ovo:

type RequireSingle<K extends PropertyKey> = {
  [P in K]: {[V in P]: string} & Partial<
    Record<Exclude<K, P>, never>
  > extends infer T
    ? {[X in keyof T]: T[X]}
    : never;
}[K];

type ComplexValue = RequireSingle<Options>;
const complex: ComplexValue = {};
// .  ~~~~~~~~ Type '{}' is not assignable to type 'ComplexValue'.
const complex1: ComplexValue = {
  option1: ""
};
const complex2: ComplexValue = {
  //  ~~~~~~~~ Type '{ option1: string; option2: string; }' is not assignable
  //           to type 'ComplexValue'.
  option1: "",
  option2: ""
};