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: ""
};
