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 }
^^^^^^^^^^^^^^^
