Menu

TypeScript Fonksiyon Tipleri: Arrow Sözdizimi ve Callback Tipleri

TypeScript'te bir fonksiyonun tipi nasıl yazılır: arrow sözdizimi (a: number) => string, fonksiyonlar için type alias'lar, arrow function'lara ve callback'lere tip vermek, call ve construct signature'lar ve Function tipinin neden fazla gevşek olduğu.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Bir fonksiyon tipi, bir fonksiyonun parametrelerini ve dönüş değerini tanımlar ve bir okla yazılır: (a: number, b: number) => number. Ona type ile bir ad verin; değişkenler, parametreler ve nesne özellikleri için kullanabilirsiniz.

add değişkenine atanan fonksiyonun notasyona ihtiyacı yoktur: parametre tipleri Operation tipinden gelir. Buna bağlamsal tipleme (contextual typing) denir ve fonksiyon tiplerine ad vermenin ana nedeni budur.

Fonksiyon Tipi Sözdizimi

Biçim (parameters) => ReturnType şeklindedir. Her parametre bir ad ve bir tip ister. Adlar okunabilirlik ve editör ipuçları içindir; parametre tipleri uyumlu olan her fonksiyon, onlara ne ad verirse versin eşleşir.

type Predicate = (value: number) => boolean;
type Formatter = (value: number, digits?: number) => string; // optional parameter
type Logger = (...parts: string[]) => void;                    // rest parameter
type Factory = () => { id: number };                           // no parameters

Ad isteğe bağlı değildir. (string) => void, tipi olmayan string adında bir parametre bildirir ve strict mod onu TS7051: Parameter has a name but no type. Did you mean 'arg0: string'? ile reddeder. (value: string) => void yazın.

Arrow Function'lara Tip Vermek

Bir arrow function'a iki şekilde tip verilebilir. Ya fonksiyonun kendisine notasyon yazarsınız ya da değişkene bir fonksiyon tipi verip parametrelerin çıkarılmasına bırakırsınız.

Bağımsız bir fonksiyon için alışılmış seçim 1. biçimdir. 3. biçim, birkaç fonksiyon tek bir imzayı paylaştığında (handler'lar, karşılaştırıcılar, dönüştürücüler) kendini amorti eder, çünkü imza bir kez yazılır ve üzerindeki bir değişiklik her yerde kontrol edilir.

Callback Tipleri

Tipi bir fonksiyon tipi olan bir parametre bir callback'tir. Çağıranın fonksiyonu ona göre kontrol edilir ve parametreleri ondan çıkarılır.

İki kural callback'leri kullanmayı rahat kılar:

  • Daha az parametre sorun değildir. Tek parametre alan bir fonksiyon, iki parametre sunulan bir yere verilebilir. JavaScript fazla argümanları yok sayar, bu yüzden TypeScript buna izin verir. Tipin sunduğundan fazla parametre ise hatadır (Target signature provides too few arguments.).
  • void dönüşü her şeyi kabul eder. (...) => void olarak tiplenmiş bir callback bir değer döndürebilir; çağıran onu kullanmayacağına söz verir. push bir sayı döndürmesine rağmen list.forEach((x) => other.push(x)) ifadesinin derlenmesinin nedeni budur.

Parametre tipleri yine de uyumlu olmalıdır. (a: number, b: number) => number beklenen yere (x: string) => ... vermek Types of parameters 'x' and 'a' are incompatible. ile başarısız olur.

Call Signature'lar

(n: number) => string, call signature'a sahip bir nesne tipinin kısa yazımıdır: { (n: number): string }. Fonksiyon özellikler de taşıdığında uzun biçime ihtiyaç duyarsınız.

TypeScript, aynı kapsamda const ile bildirilmiş bir fonksiyona özellik eklemenize izin verir ve onları fonksiyonun tipinde izler. Bir interface de bir call signature tutabilir: interface Counter { (): number; count: number }.

Bir construct signature, new ile çağrılan bir şeyi tanımlar. Başına new ekler: new (name: string) => User ya da nesne biçiminde { new (name: string): User }. Bir sınıf alan bir parametreye bu şekilde tip verirsiniz.

Metot Sözdizimi ile Özellik Sözdizimi

Bir nesne tipinde bir fonksiyon üyesi bir metot olarak, handle(value: string): void, ya da bir fonksiyon tutan bir özellik olarak, handle: (value: string) => void, yazılabilir. Birbirinin yerine geçer gibi görünürler ama strict altında farklı kontrol edilirler:

Derleyici şunu bildirir:

index.ts(8,27): error TS2322: Type '(value: string) => void' is not assignable to type '(value: string | number) => void'.
  Types of parameters 'value' and 'value' are incompatible.
    Type 'string | number' is not assignable to type 'string'.
      Type 'number' is not assignable to type 'string'.

Hata haklıdır: onlyStrings bir sayıyı ele alamaz. Metot biçimi aynı hatayı geçirir (metot parametreleri tarihsel nedenlerle "bivariant" kontrol edilir) ve a.handle(42) çalışma zamanında TypeError: value.toUpperCase is not a function ile çökerdi. O çökmeyi görmek için b satırını silin. Kendi nesne tiplerinizi yazarken özellik biçimi daha fazlasını yakalar.

Function Tipinden Kaçının

Function, her fonksiyon değerinin karşıladığı yerleşik tiptir. Neredeyse hiçbir zaman istediğiniz şey değildir: TypeScript parametreleri ya da dönüş tipini bilmez, bu yüzden her çağrı kabul edilir ve any döndürür.

Function yerine gerçek imzayı yazın. Gerçekten her fonksiyonu kabul ediyorsanız (generic bir debounce, bir loglama sarmalayıcısı), (...args: never[]) => unknown her fonksiyonu kabul eder ve sonucu any yerine yine unknown olarak tutar. Tipleri girdilerine bağlı olan fonksiyonlar için generic'ler sayfasına bakın: generic bir fonksiyon tipi <T>(value: T) => T şeklinde görünür.

Sıkça Sorulan Sorular

TypeScript'te bir fonksiyon tipi nasıl tanımlanır?

Arrow sözdizimini kullanın: (a: number, b: number) => number. Bir type alias ile ona ad verin, type Compare = (a: number, b: number) => number;, ve bu adı değişkenler, parametreler ve özellikler için kullanın. Parametre adları sözdiziminin parçasıdır ama yalnızca belgeleme içindir: farklı parametre adlarına sahip bir fonksiyon da eşleşir.

TypeScript'te bir callback parametresine nasıl tip verilir?

Fonksiyon tipini parametrenin tipi olarak yazın: function onEach(items: string[], cb: (item: string, index: number) => void) { ... }. Çağıranlar daha az parametre alan bir fonksiyon verebilir ve callback'in kendi parametreleri bu tipten çıkarılır, yani onEach(list, (item) => ...) notasyon gerektirmez.

TypeScript'te neden Function tipini kullanmamalıyım?

Function her fonksiyonu kabul eder ve onu çağırmak kontrol edilmez: her argümana izin verilir ve sonuç any olur. Bunun yerine gerçek imzayı yazın; örneğin () => void veya (value: string) => number, gerçekten her fonksiyonu kabul ediyorsanız (...args: never[]) => unknown.

Fonksiyon tipi ile call signature arasındaki fark nedir?

Aynı şeyi tanımlarlar. (n: number) => string, { (n: number): string } nesne tipinin kısa yazımıdır. Fonksiyonun özellikleri de olduğunda call signature biçimi gerekir; örneğin { (n: number): string; label: string }.

TypeScript'te bir arrow function'a nasıl tip verilir?

Ya parametrelerine ve dönüş tipine satır içi notasyon yazın, const half = (n: number): number => n / 2;, ya da değişkene bir fonksiyon tipi verip parametrelerin çıkarılmasına bırakın: const half: (n: number) => number = (n) => n / 2;.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA