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