Οι τρόποι με τους οποίους το TypeScript περιορίζει έναν τύπο μέσα σε έναν κλάδο, ομαδοποιημένοι κατά τεχνική: ενσωματωμένοι φύλακες, προσαρμοσμένα κατηγορήματα, συναρτήσεις assertion, ενώσεις με διακρίνουσα, ροή ισότητας και αληθείας, και περιορισμός μέσω ψευδωνύμων και αναβαλλόμενος. Κάθε γραμμή ζευγαρώνει την τεχνική με ένα παράδειγμα μίας γραμμής.
Περιορισμός (narrowing) είναι ο τρόπος με τον οποίο το TypeScript μετατρέπει έναν ευρύ τύπο σε στενότερο μέσα σε έναν κλάδο κώδικα, ώστε να αποδείξει ότι μια πρόσβαση σε ιδιότητα είναι ασφαλής. Κάθε έλεγχος (typeof, in, ένα κατηγόρημα, μια διακρίνουσα) λέει στον compiler: από εδώ και μετά, η τιμή είναι πιο συγκεκριμένη. Οι παρακάτω τεχνικές είναι το εργαλείο.
Πίνακας αναφοράς · 23 καταχωρήσεις
Περιορισμός τύπων στο TypeScriptExplained
23 of 23 rows
Ενσωματωμένοι φύλακες
Περιορίζει πρωτογενείς τύπους: string, number, boolean και άλλους.
if (typeof x === 'string') x.toUpperCase()
Περιορίζει σε στιγμιότυπο κλάσης ή κατασκευάσιμου τύπου.
if (e instanceof Error) e.message
Περιορίζει ελέγχοντας ότι μια ιδιότητα υπάρχει στην τιμή.
if ('id' in obj) obj.id
Περιορίζει κάθε τιμή σε πίνακα· περιορίζει μια ένωση στο μέλος της που είναι πίνακας.
if (Array.isArray(x)) x.map(f)
Προσαρμοσμένοι φύλακες
Συνάρτηση-κατηγόρημα της οποίας η επιστρεφόμενη τιμή περιορίζει το όρισμα.
function isUser(x): x is User { return !!x.id }
Ένα κατηγόρημα μπορεί να περιορίσει σε ένωση τύπων, όχι μόνο σε έναν.
function isKey(x): x is string | number
Ένα κατηγόρημα τομής κρατά τον τύπο εισόδου και του προσθέτει πεδία.
function hasId(x): x is x & { id: string }
Συνάρτηση assertion που κάνει throw εκτός αν το x είναι ο τύπος.
function assertUser(x): asserts x is User
Ενώσεις με διακρίνουσα
Περιορίζει μια ένωση μέσω κοινού πεδίου λεκτικού με switch ή if.
type E = { kind: 'a'; a: number } | { kind: 'b'; b: string }
Κάθε case περιορίζει σε ένα μέλος της ένωσης.
switch (u.kind) { case 'a': u.a }
Περιορίζει μια χωρίς ετικέτα ένωση όταν μια ιδιότητα υπάρχει μόνο σε ένα μέλος.
if ('b' in u) u.b
Κάθε case είναι μια συνθήκη· το case που ταιριάζει περιορίζει την τιμή.
switch (true) { case typeof x === 'string': }
Η περίπτωση default αναθέτει σε never, αποδεικνύοντας ότι το switch είναι εξαντλητικό.
default: { const x: never = u }
Ισότητα και ροή
Αφαιρεί τα null και undefined μετά από έλεγχο ισότητας.
if (x === null) return; x.toFixed()
Αφαιρεί τις ψευδείς τιμές (0, '', null, undefined, NaN).
if (!x) return; // x is defined here
Μια αλυσιδωτή ιδιότητα με αληθή τιμή αποδεικνύει ότι η βασική τιμή υπάρχει.
if (user?.active) user.name
Η μη-μηδενική assertion αφαιρεί τα null και undefined χωρίς έλεγχο.
x!.toFixed(2)
Οριστική ανάθεση: δηλώνει ότι στο x ανατίθεται τιμή πριν διαβαστεί.
let name!: string; init()
Ο περιορισμός ισχύει μέσα στον κλάδο και μετά από πρόωρα returns.
if (!arr) return; arr.map(...)
Ψευδώνυμα και αναβαλλόμενος περιορισμός
Ένα const boolean που κρατά έναν έλεγχο περιορίζει όπου κι αν ελεγχθεί.
const isStr = typeof x === 'string'; if (isStr) …
Μια μεταβλητή const κρατά τον περιορισμό της μέσα σε closures που την αιχμαλωτίζουν.
const s = get(); if (s) use(() => s.length)
Από το TS 5.4, ένα let ή μια παράμετρος κρατά τον περιορισμό σε closures μετά την τελευταία της ανάθεση.
let n: string | null = get(); if (n) use(() => n.length)
Το unknown δεν μπορεί να χρησιμοποιηθεί μέχρι ένας φύλακας να το περιορίσει σε πραγματικό τύπο.