javascript - Typescript: Type nesnelerinin anahtarlarının yalnızca K'den biri olduğunu ve tek anahtar:değer çifti olduğunu doğrula


Aşağıdaki koda sahibim, bu bana ts(1337) hatasını veriyor:

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

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

Burada başarmak istediğim, ComplexValue nesnelerinin anahtarlarının sadece Options’tan biri olabilmesidir.

Eğer bunu aşağıdaki seçeneklerden biriyle farklı şekilde düzeltmeye ve tanımlamaya çalışırsam:

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

// or simply

type ComplexValue = Record<ServerFilterOperator, string>

ve sonra böyle bir şey yazmaya çalışmak

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

sonra aşağıdaki hatayı alıyorum Type '{ [x: string]: string; }' türü 'ComplexValue' türünden şu özellikleri eksik: option2, option3.ts(2740)

Uygulayabileceğim bir çözüm, tanıma type ComplexValue={ [key in Options]?: string } ? eklemektir - bu, tüm anahtarların isteğe bağlı olmasını sağlar. Ama aslında yalnızca tek bir key:value çiftinin geçirilmesini doğrulamak istiyorum.

ComplexValue nesnelerinin anahtarlarının yalnızca Options içinden biri olabileceğini ve nesnede yalnızca bir key:value çiftinin bulunabileceğini doğrulamanın doğru yolu nedir?

TS oyun alanına bağlantı burada

Cevap #1

Biraz zor ama halledebilirsin. Birkaç başka cevaptan ilham alarak bunu buldum:

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