Menu

TypeScript Fonksiyonlar: Parametre ve Dönüş Tipleri, void

TypeScript'te fonksiyonlara nasıl tip verilir: her parametreye notasyon yazın, dönüş tipini yazın ya da çıkarılmasına bırakın, hiçbir şey döndürmeyen fonksiyonlar için void kullanın ve arrow function'lara, function expression'lara, async fonksiyonlara ve this parametresine tip verin.

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

Bir TypeScript fonksiyonu, parametrelerinde ve isteğe bağlı olarak dönüş değerinde tipler olan bir JavaScript fonksiyonudur. Her parametre bir notasyon alır, dönüş tipi parametre listesinden sonra gelir ve derleyici her çağrıyı ikisine göre de kontrol eder.

İki hatalı çağrı da derleme zamanı hatasıdır (TS2345 ve TS2554). // @ts-expect-error yorumları derleyiciye sonraki satırda bir hata beklendiğini söyler, böylece dosyanın geri kalanı yine çalışır. Birini silin ve gerçek mesajı görmek için yeniden çalıştırın.

Parametre Tipleri

Her parametre name: Type şeklinde yazılır. TypeScript 7'de varsayılan olarak açık olan strict altında, notasyonu olmayan ve çıkarım yapılacak bağlamı bulunmayan bir parametre hatadır: Parameter 'x' implicitly has an 'any' type. (TS7006). Yani pratikte bağımsız bir fonksiyonun her parametresine notasyon yazılır.

Parametre tipi olarak her tip kullanılabilir: primitive'ler, diziler, nesne tipleri, union'lar, başka fonksiyonlar.

TypeScript argüman sayısını da kontrol eder. Fonksiyonun bildirdiğinden fazla ya da az argüman vermek hatadır; eksikleri undefined ile dolduran ve fazlaları yok sayan düz JavaScript'in aksine. Bir parametreyi opsiyonel yapmak veya ona varsayılan değer vermek için opsiyonel parametreler sayfasına bakın.

Dönüş Tipleri: Yazmak ya da Çıkarımına Bırakmak

Dönüş tipi kapanış parantezinden sonra gelir: function f(): Type. İsteğe bağlıdır. Yazılmazsa TypeScript tipi gövdedeki her return ifadesinden çıkarır.

Fonksiyon export edildiğinde, birkaç dönüş yolu olduğunda ya da özyinelemeli olduğunda notasyon kendini amorti eder. Hata o zaman bir çağıranda değil, fonksiyonun içinde, yanlış return ifadesinde görünür. Klasik bir örnek, döndürmeyi unutan bir daldır:

Derleyici index.ts(2,32): error TS2366: Function lacks ending return statement and return type does not include 'undefined'. bildirir. Sona bir return "C"; ekleyin, çalışır. : string notasyonu olmasaydı fonksiyon "A" | "B" | undefined çıkarılan tipiyle derlenir ve sorun sonucu kullanan kişiye kayardı.

void: Hiçbir Şey Döndürmeyen Fonksiyonlar

Yalnızca bir şey yapan (loglayan, yazan, değiştiren) bir fonksiyonun dönüş tipi void olur. Değer içeren bir return olmadığında TypeScript'in çıkardığı budur ve bunu açıkça da yazabilirsiniz.

void ile ilgili şu kurallar insanları şaşırtır:

Durumİzin var mı?
function f(): void { return 42; }Hayır: Type 'number' is not assignable to type 'void'. (TS2322)
const f: () => void = () => 42;Evet: değer döndürülür ama çağıranlar ona güvenmemelidir
function f(): undefined {}Evet (TypeScript 5.1 ve sonrası)
Bir void fonksiyonunun sonucunu bir if içinde kullanmakHayır: An expression of type 'void' cannot be tested for truthiness. (TS1345)

İkinci satır kasıtlıdır. push bir sayı döndürmesine rağmen arr.forEach(x => list.push(x)) ifadesinin derlenmesinin nedeni budur. Bir fonksiyon tipindeki void "bu ne döndürürse döndürsün, kimse onu okumaz" anlamına gelir. Hiç dönmeyen bir fonksiyon için (her zaman hata fırlatır veya sonsuza kadar döner) dönüş tipi never olur.

Arrow Function'lar ve Function Expression'lar

Arrow function'lar ve function expression'lar aynı notasyonları alır. Dönüş tipi parametre listesinden sonra, => işaretinden önce gelir.

Parantezler olmadan (x, y) => { x, y } ifadesi return içermeyen bir bloktur ve fonksiyon undefined döndürür. Arrow function'ların çalışma zamanı kuralları (kendi this değerleri yok, arguments yok) JavaScript'tekiyle aynıdır; bkz. JavaScript'te arrow function'lar.

Bir fonksiyon bir argüman olarak satır içi yazıldığında parametrelerine genellikle hiç notasyon yazmazsınız. TypeScript callback'in ne aldığını, onun verildiği fonksiyondan bilir (bağlamsal tipleme): [1, 2].map(n => n * 2) ifadesinde n zaten number tipindedir. Bir fonksiyonun tipini bir değer olarak yazmak, (n: number) => string, fonksiyon tipleri sayfasında anlatılıyor.

Birden Fazla Değer Döndürmek

Bir fonksiyon tek bir değer döndürür, bu yüzden bir nesne ya da bir tuple döndürün ve destructuring yapın.

Tuple dönüş tipi notasyon ister. Notasyon olmadan [a, b] bir string[] olarak çıkarılır: destructuring yine çalışır ama tip artık tam olarak iki eleman olduğunu söylemez.

Async Fonksiyonlar

Bir async fonksiyon her zaman bir Promise döndürür. Dönüş tipini Promise<T> olarak yazın; burada T fonksiyonun içeride döndürdüğü şeydir.

async function loadScore(id: number): Promise<number> {
  await new Promise((resolve) => setTimeout(resolve, 10));
  return id * 10;
}

async function main(): Promise<void> {
  const score = await loadScore(4); // score: number
  console.log("score", score);
}

main();

async function f(): number yazmak bir hatadır: The return type of an async function or method must be the global Promise<T> type. Did you mean to write 'Promise<number>'? (TS1064).

this Parametresi

JavaScript this değerine çağrı anında karar verir. TypeScript, this adında sahte bir ilk parametreyle this değerinin ne olması gerektiğini bildirmenize izin verir. Derlenmiş JavaScript'ten kaldırılır ve çağıranlar onu vermez.

interface Counter {
  count: number;
}

function increment(this: Counter, by: number): void {
  this.count += by;
}

const c = { count: 0, increment };
c.increment(2); // fine: this is c

increment(2);
// error TS2684: The 'this' context of type 'void' is not assignable to method's 'this' of type 'Counter'.

this parametresi olmadan bağımsız bir fonksiyonun içindeki this örtük bir any olur ve strict mod 'this' implicitly has type 'any' because it does not have a type annotation. (TS2683) bildirir. Sınıf metotlarında this zaten sınıf örneği olarak tiplenmiştir; bu yüzden parametre çoğunlukla nesnelere bağlanan bağımsız fonksiyonlar ve kütüphanelerin belirli bir this ile çağırdığı callback'ler için kullanışlıdır.

Sıkça Sorulan Sorular

TypeScript'te bir fonksiyonun dönüş tipi nasıl belirtilir?

Parametre listesinden sonra iki nokta üst üste ve tipi yazın: function total(a: number, b: number): number { ... }. Bir arrow function'da aynı yere gelir: const total = (a: number, b: number): number => a + b;. Yazmazsanız TypeScript dönüş tipini return ifadelerinden çıkarır.

TypeScript'te dönüş tipini her zaman yazmalı mıyım?

İsteğe bağlıdır, çünkü dönüş tipi çıkarılır. Export edilen fonksiyonlarda ve birkaç return yolu olan fonksiyonlarda yazın: notasyon sözleşmeyi belgeler ve yanlış bir return o zaman uzaktaki bir çağıranda değil, fonksiyonun içinde bildirilir.

TypeScript'te void ile undefined arasındaki fark nedir?

void, "çağıran dönüş değerini kullanmamalı" anlamına gelir. undefined ise somut bir değer tipidir. (): void olarak bildirilen bir fonksiyon değer döndüremez, ama () => void şeklindeki bir callback tipi bir şey döndüren bir fonksiyonu kabul eder ve sonuç basitçe yok sayılır. Hiçbir şey döndürmeyen fonksiyonlar için void, undefined tipini ise yalnızca çağıranlar sonucu gerçekten undefined ile karşılaştırıyorsa kullanın.

Bir TypeScript fonksiyonundan birden fazla değer nasıl döndürülür?

Bir nesne ({ min: number; max: number }) ya da bir tuple ([number, number]) döndürün ve çağrı yerinde destructuring yapın. Değerlerin farklı anlamları olduğunda nesneler daha anlaşılırdır; tuple'lar [value, setValue] gibi kısa çiftlerde iyi okunur.

TypeScript'te bir async fonksiyonun dönüş tipi nedir?

Her zaman bir Promise. Bir number döndüren async fonksiyonun dönüş tipi Promise<number> olur ve üzerine : number yazmak bir derleme hatasıdır (TS1064). Hiçbir şey döndürmeyen bir fonksiyon Promise<void> olur.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA