typescript - Fonksiyonların aynı aşırı yüklemelerle argümanları nasıl geçirmesi sağlanır?
Bir fonksiyonun argümanlarını başka bir fonksiyona geçiren bir fonksiyon oluşturmaya çalışıyorum. Bu iki fonksiyonun da aynı aşırı yüklemelere sahip olması gerekiyor.
function original (a: number): boolean;
function original (a: string, b: string): boolean;
function original (a: number | string, b?: string): boolean {
return true;
}
function pass (a: number): boolean;
function pass (a: string, b: string): boolean;
function pass (a: number | string, b?: string): boolean {
return original(a, b);
}
Bu işe yaramıyor.
‘string | number’ türündeki argüman, ‘string’ türündeki parametreye atanamaz.
Type 'number', type 'string'e atanamaz. (2345) input.tsx(4, 10): Çağrı bu uygulama için başarılı olabilirdi, ancak aşırı yüklemelerin uygulama imzaları dışarıdan görünür değildir.
Oyun alanı
Cevap #1
pass fonksiyonunuzu, original fonksiyonun türünde olarak typeof operatörünü kullanarak beyan edebilirsiniz, örneğin.
function original (a: number): boolean;
function original (a: string, b: string): boolean;
function original (): boolean {
return true;
}
let pass: typeof original = () => {
return true;
};
pass(5); // all good
pass('a', 'b'); // all good
pass(45, 'b'); // error here
Oyun alanı burada
Cevap #2
Ek yükleme ekle:
function original<
A extends number | string,
B extends A extends string ? string : undefined
>(a: A, b: B): boolean;
Şimdi şöyle görünüyor:
function original(a: number): boolean;
function original(a: string, b: string): boolean;
function original<
A extends number | string,
B extends A extends string ? string : undefined
>(a: A, b: B): boolean;
function original(a: number | string, b?: string): boolean {
return true;
}
function pass(a: number): boolean;
function pass(a: string, b: string): boolean;
function pass(a: number | string, b?: string): boolean {
return original(a, b); // Works
}
const t1 = original(1); // Works
const t2 = original("foo", "foo"); // Works
const t3 = original(1, "foo"); // Works: gives an error as expected
const t4 = original("foo"); // Works: gives an error as expected
Artık ikinci aşırı yüklemeye function original(a: string, b: string): boolean gerek yok ama kodun okunabilirliğini artırmak için yine de bırakabilirsiniz.
Oyun alanı
