Menu

TypeScript Opsiyonel Parametreler, Varsayılan Değerler ve Rest

Bir TypeScript parametresini ? ile opsiyonel yapın, ona varsayılan bir değer verin ya da bir rest parametresiyle istediğiniz sayıda argümanı toplayın. Sıralama kuralları, atlamak ile undefined farkı, seçenek nesneleri ve fonksiyon tiplerinde opsiyonel parametreler.

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

Bir parametreyi opsiyonel yapmak için adından sonra ? ekleyin. Çağıranlar onu atlayabilir ve fonksiyonun içinde tipi undefined içerir.

TypeScript argüman sayısını kontrol eder, bu yüzden ? olmadan ilk çağrı bir derleme hatası olurdu: Expected 2 arguments, but got 1. (TS2554).

Opsiyonel Parametreler undefined Olabilir

Bir çağıran onu atlayabildiği için opsiyonel bir parametrenin fonksiyon içindeki tipi T | undefined olur. strictNullChecks altında onu bir T olarak kullanmadan önce undefined durumunu ele almanız gerekir.

Burada alışılmış araçlar optional chaining (?.) ve nullish coalescing (??) operatörleridir. Yedek değer sabit bir değer olduğunda varsayılan bir parametre daha kısadır.

Varsayılan Parametre Değerleri

Bir varsayılan değer, parametreyi çağıranlar için opsiyonel yapar ve fonksiyonun içinde ona undefined içermeyen bir tip verir. Tip varsayılandan çıkarılır, bu yüzden notasyon çoğu zaman gereksizdir.

Çağıran repeat(text: string, times?: number, separator?: string) imzasını görür. Varsayılanlar JavaScript'in kuralını izler: argüman undefined olduğunda uygulanırlar, atlanmış ya da açıkça verilmiş olsun; null olduğunda uygulanmazlar. Bir varsayılan ifadesi önceki parametreleri kullanabilir: function range(start: number, end = start + 10).

Parametre Sırası Kuralları

BildirimDerlenir mi?Notlar
(a: number, b?: number)EvetOpsiyonel parametreler sona gelir
(a?: number, b: number)HayırTS1016: A required parameter cannot follow an optional parameter.
(a = 0, b: number)EvetAma çağıranlar varsayılanı kullanmak için f(undefined, 5) yazmak zorundadır
(a: number, ...rest: number[])EvetRest parametresi her zaman sondadır
(a?: number, ...rest: number[])EvetRest'ten önce opsiyonel olabilir

Zorunlu bir parametreden önce varsayılanlı bir parametre yasaldır ama kullanışsızdır. Çağıranlar için tipi number | undefined olur ve kimse yer tutucu olarak undefined yazmaktan hoşlanmaz. Esnek bir baş parametreye ihtiyacınız varsa bunun yerine bir seçenek nesnesi ya da function overloading kullanın.

Atlamak ile undefined

x?: number ve x: number | undefined birbirine benzer ve fonksiyonun içinde aynı tipe sahiptir. Çağıran açısından ayrılırlar: ilki atlanabilir, ikincisi verilmelidir.

Değeri olmamasına izin verilen zorunlu bir argüman için | undefined kullanın, böylece her çağıran onu düşünmek zorunda kalır. Atlamanın normal bir çağrı olduğu durumlarda ? kullanın. (Mesaj gerçekten "1 arguments" diyor: bu TypeScript'in ifadesi.)

Rest Parametreleri

Bir rest parametresi, ...name: T[], istenen sayıda argümanı bir dizide toplar. Son parametre olmalıdır.

Bir diziyi sabit parametrelere yaymak daha katıdır. Bir rest parametresi herhangi bir number[] yaymasını kabul eder, ama (a: number, b: number) olarak bildirilmiş bir fonksiyon yalnızca bir tuple yaymasını kabul eder, çünkü TypeScript'in uzunluğu bilmesi gerekir:

function point(x: number, y: number) { return { x, y }; }

const list = [3, 4];            // number[]
point(...list);
// error TS2556: A spread argument must either have a tuple type or be passed to a rest parameter.

const pair = [3, 4] as const;   // readonly [3, 4]
point(...pair);                 // fine

Bir rest parametresi, her konuma tip veren bir tuple tipine de sahip olabilir: ...args: [name: string, age?: number].

Seçenek Nesneleri

Bir fonksiyonun iki üçten fazla opsiyonel parametresi olduğunda çağıranlar konumları takip edemez hale gelir. Varsayılanlara sahip bir seçenek nesnesi, isimli ve sıradan bağımsız argümanlar sağlar.

Sondaki = {}, nesnenin tamamını opsiyonel yapar. O olmadan fetchData("/a") bir derleme hatasıdır (Expected 2 arguments, but got 1., TS2554); düz JavaScript'te de aynı çağrı çalışma zamanında bir TypeError fırlatırdı, çünkü destructuring okunacak bir nesneye ihtiyaç duyar.

Callback Tiplerinde Opsiyonel Parametreler

Bir fonksiyon tipinde ?, "bu callback'i çağıran onu vermeyebilir" anlamına gelir. "Callback onu atlayabilir" anlamına gelmez: bir callback sondaki parametreleri her zaman yok sayabilir. Bu yüzden callback parametrelerini, handler'ların daha az argüman almasına izin vermek için opsiyonel yapmayın.

// Too loose: every handler must now cope with index being undefined
type Visit = (item: string, index?: number) => void;

// Right: the caller always passes both; handlers may use only item
type VisitStrict = (item: string, index: number) => void;
const log: VisitStrict = (item) => console.log(item);

Sıkça Sorulan Sorular

TypeScript'te bir parametre nasıl opsiyonel yapılır?

Adından sonra bir ? koyun: function greet(name?: string). Çağıranlar onu atlayabilir ve fonksiyonun içinde tipi string | undefined olur, bu yüzden kullanmadan önce kontrol edersiniz. Parametreye bir varsayılan değer vermek, name = "there", de onu opsiyonel yapar ve fonksiyonun içindeki undefined durumunu kaldırır.

TypeScript'te opsiyonel bir parametre zorunlu bir parametreden önce gelebilir mi?

? ile olmaz: (a?: number, b: number) TS1016 hatasıdır, "A required parameter cannot follow an optional parameter." Varsayılan değeri olan bir parametre önce gelebilir, ama bu durumda çağıranlar varsayılanı kullanmak için açıkça undefined vermek zorundadır; bu yüzden pratikte opsiyonel ve varsayılanlı parametreler sona gelir.

x?: number ile x: number | undefined arasındaki fark nedir?

Fonksiyonun içinde ikisi de number | undefined olur. Fark çağrı yerindedir: x?: number ile argüman atlanabilir, x: number | undefined ile ise değer undefined olsa bile verilmelidir. Atlamak TS2554 hatası verir.

null vermek varsayılan parametre değerini kullanır mı?

Hayır. JavaScript bir varsayılanı yalnızca argüman undefined olduğunda uygular (atlanmış ya da açıkça verilmiş). null bir değerdir, bu yüzden korunur. TypeScript zaten strictNullChecks altında bir number parametresi için null değerini reddeder.

TypeScript'te bir diziyi ayrı argümanlar olarak nasıl veririm?

Yayın: fn(...args). Sabit parametreli bir fonksiyon için dizi [number, number] gibi bir tuple tipine sahip olmalı ya da as const ile oluşturulmalıdır; bir number[] yaymak TS2556 hatası verir, çünkü uzunluğu bilinmez. Bir rest parametresine (...values: number[]) yaymak her zaman çalışır.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA