typescript - Genellikle tür parametresinin geçilip geçilmediğine bağlı olarak isteğe bağlı özellik


T geçtiğinde a'nın T olarak yazılmasını ve geçmediğinde a'nın isteğe bağlı (eksik bir özellik) olmasını sağlayacak bir arayüz nasıl yapılır, örneğin:

interface A<T = void> {
  a: T
}

const a1: A<string> = { a: 'a' } // 👈 No error, good

const a2: A = {}

// 👆 Should not throw
// "Property 'a' is missing in type '{}' but required in type 'A<void>'.ts(2741)"

Aşağıdaki yaklaşımla ilgili tek sorun, a'nın nesneden eksik olamamasıdır:

interface A<T = void> {
  a: T extends void ? undefined : T
}

const a3: A = {}

// 👆 TS throws
// "Property 'a' is missing in type '{}' but required in type 'A<void>'. ts(2741)"

Cevap #1

T için varsayılan tür olarak undefined neden olmasın?

Aksi takdirde, koşullu türler kullanabilirsiniz:

interface A<T = void> {
    a: T extends void ? undefined : T
}

Undefined türünde zorunlu bir özelliğe sahip olmaktan kaçınmak ve özelliği tamamen kaldırmak için, onun yerine türleri kullanmayı deneyin:

type A<T = void> = T extends void ? Record<string, never> : { a: T }

... burada Record<string, never>, boş bir nesneyi ifade etmenin şık bir yoludur (herhangi bir null olmayan değeri ifade eden {} kullanmayın, çünkü bu örneğin bir string gibi değerleri de kabul eder). Eğer daha sonra a'nın yanında her zaman bulunan ek özelliklere ihtiyacınız olursa, şöyle bir şey yazabilirsiniz:

type A<T = void> = T extends void ? Record<string, never> : { a: T } & { b: number }
                                                                     ^^^^^^^^^^^^^^^

İlgili makaleler