aşırı yükleme - Typescript aşırı yükleme ok fonksiyonları


Böyle yapabiliriz:

export function myMethod (param: number) :number
export function myMethod (param: string) :string

export function myMethod (param: string | number): string | number {
  if (typeof param === 'string') {
    return param.toUpperCase()
  } else {
    return param + 1
  }
}

Bunu ok fonksiyonu ile beyan edip uygulayabilir miyim?

export var myMethodArror = (param: string): string
export var myMethodArror = (param: number): number

export var myMethodArror = (param: string | number): string | number => {
..
}

Değişken beyanını çoğaltmanın mümkün olmadığının farkındayım, ama sorum şu: ok işareti (arrow) notasyonu kullanarak fonksiyon aşırı yüklemesi yapmak mümkün mü?

Cevap #1

Sanırım o zamandan şimdiye eklenmiş, çünkü şimdi bunu bir arayüz veya tip kullanarak yapabilirsiniz (önemi yok, aynı sözdizimi anahtar kelime dışında). Tabii ki export olarak da çalışıyor. Fonksiyonun isimlendirilmiş olması gerekiyor (sanırım tüm aşırı yüklenmiş fonksiyonlarda bu geçerli), bu yüzden callback olarak kullanmak istiyorsanız önce onu tanımlamanız gerekecek.

type IOverload = {
    (param: number): number[];
    (param: object): object[];
}

const overloadedArrowFunc: IOverload = (param: any) => {
    return [param, param];
}

let val = overloadedArrowFunc(4);

Bunu böyle olmasını çok daha çok tercih ederim, bu tekrar yazma gereksinimini azaltıyor. İsmi defalarca yazmak sinir bozucu.

Ayrıca, bununla ilgili herhangi bir soruyu öne almadan önce, evet, parametreyi uygulamada any olarak bildirdim. Mevcut durumda derlemeye izin vermek için bu gerekli ve evet, @ford04'ün belirttiği gibi fonksiyon içinde tür güvenliğini kaybedeceksiniz. Görünüşe göre TypeScript, fonksiyonlar ve dönüşleri söz konusu olduğunda işaretli birlikleri hala doğru şekilde işleyemiyor. Alternatif olarak daha katı parametrelere sahip olabilirsiniz ama o zaman dönüş değerini herhangi bir türe (any) dönüştürmeniz gerekecek.

Cevap #2

Bu çözüm @Sam96'a dayanıyor ancak ok fonksiyonunun kodunu tamamen türlendirilmiş şekilde tutuyor.

type Create = {
  (): Vector<0>;
  <T>(x: T): Vector<T>;
  <T>(x: T, y: T): Vector<T>;
};

const create: Create = <T>(
  x?: T,
  y?: T
) => ({
  x: x ?? 0,
  y: y ?? x ?? 0,
});

Cevap #3

Aşırı yükleme için kesişim operatörü & kullanabilirsiniz.

export let myMethodArror = ((param: string | number): string | number => {
...
}) as ((param: string) => string) & ((param: number) => number)

İlgili makaleler