Fonksiyon Parametreleri ile Typescript generikleri
Generikler kullanarak bir TypeScript metodunu açmaya çalışıyorum. Metotlara sahip bir nesne var (yorum, farklı türde fonksiyon parametrelerini gösteriyordu)
const emailTypes = {
confirmEmail: generateConfirmEmailOptions, // { a: string, b: string;}
restorePassword: generateRestorePasswordOptions, // { a: string, b: number;}
};
Bu nesnenin tuşlarıyla yazın:
export type IEmailTypes = typeof emailTypes;
ve yöntemin kendisi:
export const getEmailOptions = <T extends keyof IEmailTypes>(emailType: T, emailData: Parameters<IEmailTypes[T]>[0]) =>
emailTypes[emailType](emailData);
Şimdi (emailData)'ya küfrediyor, nedenini anlayamıyorum. Doğru bir şey yaptığımı düşünüyordum. Anahtarın isimlerini T'ye aktarıyorum, sonra bu anahtar için fonksiyon parametrelerini alıyorum. Ama hayır, farklı türlerdeyse küfrediyor.
Öyle yapmak istiyorum ki, örneğin emailType içinde confirmEmail iletirken, TS bana emailData'nın tam olarak ne olması gerektiğini söylesin
Ben neyi yanlış yapıyorum?
Açıklık olması için bir ekran görüntüsü ekleyeceğim.
*emailTypes içindeki yöntemlerin parametre türleri vardır
Cevap #1
Cevabı burada @jcalz kontrol et.
Yani ya tür güvenliğinden feragat ederek dönüştürme yaparsınız, ya da derleyiciye yardımcı olmak için bunu yeniden yapılandırmanız gerekir. Şöyle görünebilir:
declare const generateConfirmEmailOptions: (opts: { a: string; b: string }) => void
declare const generateRestorePasswordOptions: (opts: { a: string; b: number }) => void
interface Args {
confirmEmail: Parameters<typeof generateConfirmEmailOptions>[0]
restorePassword: Parameters<typeof generateRestorePasswordOptions>[0]
}
type Mapping = { [K in keyof Args]: (opts: Args[K]) => void }
const emailTypes: Mapping = {
confirmEmail: generateConfirmEmailOptions,
restorePassword: generateRestorePasswordOptions,
};
const getEmailOptions = <K extends keyof Args>(emailType: K, emailData: Args[K]) => {
const fn = emailTypes[emailType]
return fn(emailData);
}
Evet, bazı kodları çoğaltmak zorunda olmanız biraz talihsiz, ama görünüşe göre şu an bunu yapmanın %100 type-safe olan tek yolu bu. Haydi, TypeScript'in gelecekteki sürümlerinin neler getirdiğine bakalım.
