Skip to content

TypeScript Tip Daraltma açıklaması

TypeScript'in bir dal içinde tipi nasıl daralttığının yolları, tekniğe göre gruplanmış: yerleşik guard'lar, özel predicate'ler, assertion fonksiyonları, discriminated union'lar, eşitlik ve truthiness akışı ile alias'lanmış ve ertelenmiş daraltma. Her satır tekniği tek satırlık bir örnekle eşleştirir.

Daraltma, TypeScript'in bir kod dalı içinde geniş bir tipi daha dar bir tipe dönüştürmesidir; böylece bir özelliğe erişimin güvenli olduğunu kanıtlayabilir. Her kontrol (typeof, in, bir predicate, bir discriminator) derleyiciye şunu söyler: buradan itibaren değer daha spesifiktir. Aşağıdaki teknikler çalışan settir.

Referans tablosu · 23 kayıt
23 of 23 rows
Yerleşik guard'lar
Primitifleri daraltır: string, number, boolean ve daha fazlası.if (typeof x === 'string') x.toUpperCase()
Bir sınıf veya kurulabilir (constructable) instance'a daraltır.if (e instanceof Error) e.message
Değerde bir özelliğin varlığını kontrol ederek daraltır.if ('id' in obj) obj.id
Herhangi bir değeri array'e daraltır; bir union'ı array üyesine daraltır.if (Array.isArray(x)) x.map(f)
Özel guard'lar
Dönüşü argümanı daraltan bir predicate fonksiyonu.function isUser(x): x is User { return !!x.id }
Bir predicate yalnızca tek tipe değil, tiplerin union'ına da daraltabilir.function isKey(x): x is string | number
Bir intersection predicate girdi tipini korur ve ona alanlar ekler.function hasId(x): x is x & { id: string }
x o tip olmadığında throw eden bir assertion fonksiyonu.function assertUser(x): asserts x is User
Discriminated union'lar
Ortak bir literal alan üzerinden switch veya if ile union'ı daraltır.type E = { kind: 'a'; a: number } | { kind: 'b'; b: string }
Her case, union'ın tek bir üyesine daraltır.switch (u.kind) { case 'a': u.a }
Bir özellik yalnızca bir üyede varken etiketsiz union'ı daraltır.if ('b' in u) u.b
Her case bir koşuldur; eşleşen case değeri daraltır.switch (true) { case typeof x === 'string': }
Default case never'a atama yaparak switch'in eksiksiz olduğunu kanıtlar.default: { const x: never = u }
Eşitlik & akış
Eşitlik kontrolünden sonra null ve undefined'ı kaldırır.if (x === null) return; x.toFixed()
Falsy değerleri kaldırır (0, '', null, undefined, NaN).if (!x) return; // x is defined here
Truthy olan zincirlenmiş bir özellik, taban değerin mevcut olduğunu kanıtlar.if (user?.active) user.name
Non-null assertion, kontrol yapmadan null ve undefined'ı kaldırır.x!.toFixed(2)
Definite assignment: x'in okunmadan önce atanmış olduğunu bildirir.let name!: string; init()
Daraltma dal içinde ve erken return'lerden sonra geçerlidir.if (!arr) return; arr.map(...)
Alias'lanmış & ertelenmiş
Bir kontrolü tutan const boolean, test edildiği her yerde daraltır.const isStr = typeof x === 'string'; if (isStr) …
Bir const değişken, onu yakalayan closure'lar içindeki daraltmayı korur.const s = get(); if (s) use(() => s.length)
TS 5.4'ten itibaren bir let veya parametre, son atamasından sonra closure'larda daraltılmış kalır.let n: string | null = get(); if (n) use(() => n.length)
unknown, bir guard onu gerçek bir tipe daraltana kadar kullanılamaz.if (typeof u === 'string') u.length