Ελληνικά

Ένας αναλυτικός οδηγός για τις συναρτήσεις επιβεβαίωσης του TypeScript. Μάθετε πώς να γεφυρώνετε το χάσμα μεταξύ compile-time και runtime, να επικυρώνετε δεδομένα και να γράφετε ασφαλέστερο, πιο στιβαρό κώδικα με πρακτικά παραδείγματα.

Συναρτήσεις Επιβεβαίωσης (Assertion Functions) στο TypeScript: Ο Απόλυτος Οδηγός για Ασφάλεια Τύπων κατά την Εκτέλεση

Στον κόσμο του web development, η συμφωνία μεταξύ των προσδοκιών του κώδικά σας και της πραγματικότητας των δεδομένων που λαμβάνει είναι συχνά εύθραυστη. Το TypeScript έχει φέρει επανάσταση στον τρόπο που γράφουμε JavaScript, παρέχοντας ένα ισχυρό σύστημα στατικών τύπων, εντοπίζοντας αμέτρητα σφάλματα πριν καν φτάσουν στην παραγωγή. Ωστόσο, αυτό το δίχτυ ασφαλείας υπάρχει κυρίως κατά το compile-time. Τι συμβαίνει όταν η όμορφα τυποποιημένη εφαρμογή σας λαμβάνει ακατάστατα, απρόβλεπτα δεδομένα από τον έξω κόσμο κατά το runtime; Εδώ είναι που οι συναρτήσεις επιβεβαίωσης (assertion functions) του TypeScript γίνονται ένα απαραίτητο εργαλείο για τη δημιουργία πραγματικά στιβαρών εφαρμογών.

Αυτός ο αναλυτικός οδηγός θα σας κάνει μια βαθιά βουτιά στις συναρτήσεις επιβεβαίωσης. Θα εξερευνήσουμε γιατί είναι απαραίτητες, πώς να τις δημιουργήσετε από το μηδέν και πώς να τις εφαρμόσετε σε συνήθη, πραγματικά σενάρια. Στο τέλος, θα είστε εξοπλισμένοι να γράφετε κώδικα που δεν είναι μόνο ασφαλής ως προς τους τύπους κατά το compile-time, αλλά και ανθεκτικός και προβλέψιμος κατά το runtime.

Το Μεγάλο Χάσμα: Compile-Time εναντίον Runtime

Για να εκτιμήσουμε πραγματικά τις συναρτήσεις επιβεβαίωσης, πρέπει πρώτα να κατανοήσουμε τη θεμελιώδη πρόκληση που λύνουν: το χάσμα μεταξύ του κόσμου του compile-time του TypeScript και του κόσμου του runtime της JavaScript.

Ο Παράδεισος του Compile-Time στο TypeScript

Όταν γράφετε κώδικα TypeScript, εργάζεστε σε έναν παράδεισο για προγραμματιστές. Ο μεταγλωττιστής του TypeScript (tsc) λειτουργεί ως ένας άγρυπνος βοηθός, αναλύοντας τον κώδικά σας σε σχέση με τους τύπους που έχετε ορίσει. Ελέγχει για:

Αυτή η διαδικασία συμβαίνει πριν εκτελεστεί ποτέ ο κώδικάς σας. Το τελικό αποτέλεσμα είναι απλή JavaScript, απογυμνωμένη από όλες τις σημειώσεις τύπων. Σκεφτείτε το TypeScript σαν ένα λεπτομερές αρχιτεκτονικό σχέδιο για ένα κτίριο. Διασφαλίζει ότι όλα τα σχέδια είναι σωστά, οι μετρήσεις είναι ακριβείς και η δομική ακεραιότητα είναι εγγυημένη στα χαρτιά.

Η Πραγματικότητα του Runtime στη JavaScript

Μόλις το TypeScript σας μεταγλωττιστεί σε JavaScript και εκτελεστεί σε έναν browser ή σε ένα περιβάλλον Node.js, οι στατικοί τύποι έχουν εξαφανιστεί. Ο κώδικάς σας λειτουργεί πλέον στον δυναμικό, απρόβλεπτο κόσμο του runtime. Πρέπει να διαχειριστεί δεδομένα από πηγές που δεν μπορεί να ελέγξει, όπως:

Για να χρησιμοποιήσουμε την αναλογία μας, το runtime είναι το εργοτάξιο. Το σχέδιο ήταν τέλειο, αλλά τα υλικά που παραδόθηκαν (τα δεδομένα) μπορεί να είναι λάθος μεγέθους, λάθος τύπου ή απλά να λείπουν. Αν προσπαθήσετε να χτίσετε με αυτά τα ελαττωματικά υλικά, η κατασκευή σας θα καταρρεύσει. Εδώ είναι που συμβαίνουν τα σφάλματα runtime, οδηγώντας συχνά σε καταρρεύσεις και σφάλματα όπως "Cannot read properties of undefined".

Εδώ Έρχονται οι Συναρτήσεις Επιβεβαίωσης: Γεφυρώνοντας το Χάσμα

Λοιπόν, πώς επιβάλλουμε το αρχιτεκτονικό μας σχέδιο TypeScript στα απρόβλεπτα υλικά του runtime; Χρειαζόμαστε έναν μηχανισμό που να μπορεί να ελέγξει τα δεδομένα *καθώς φτάνουν* και να επιβεβαιώσει ότι ταιριάζουν με τις προσδοκίες μας. Αυτό ακριβώς κάνουν οι συναρτήσεις επιβεβαίωσης.

Τι είναι μια Συνάρτηση Επιβεβαίωσης;

Μια συνάρτηση επιβεβαίωσης είναι ένα ειδικό είδος συνάρτησης στο TypeScript που εξυπηρετεί δύο κρίσιμους σκοπούς:

  1. Έλεγχος κατά το Runtime: Εκτελεί μια επικύρωση σε μια τιμή ή συνθήκη. Αν η επικύρωση αποτύχει, προκαλεί ένα σφάλμα (throws an error), σταματώντας αμέσως την εκτέλεση αυτής της διαδρομής κώδικα. Αυτό εμποδίζει τη διάδοση μη έγκυρων δεδομένων στην εφαρμογή σας.
  2. Στένωση Τύπου κατά το Compile-Time: Αν η επικύρωση επιτύχει (δηλαδή, δεν προκληθεί σφάλμα), σηματοδοτεί στον μεταγλωττιστή του TypeScript ότι ο τύπος της τιμής είναι πλέον πιο συγκεκριμένος. Ο μεταγλωττιστής εμπιστεύεται αυτήν την επιβεβαίωση και σας επιτρέπει να χρησιμοποιήσετε την τιμή ως τον επιβεβαιωμένο τύπο για το υπόλοιπο της εμβέλειάς της.

Η μαγεία βρίσκεται στην υπογραφή της συνάρτησης, η οποία χρησιμοποιεί τη λέξη-κλειδί asserts. Υπάρχουν δύο κύριες μορφές:

Το βασικό στοιχείο που πρέπει να θυμάστε είναι η συμπεριφορά "throw on failure". Σε αντίθεση με έναν απλό έλεγχο if, μια επιβεβαίωση δηλώνει: «Αυτή η συνθήκη πρέπει να είναι αληθής για να συνεχίσει το πρόγραμμα. Αν δεν είναι, πρόκειται για μια εξαιρετική κατάσταση και πρέπει να σταματήσουμε αμέσως».

Δημιουργώντας την Πρώτη σας Συνάρτηση Επιβεβαίωσης: Ένα Πρακτικό Παράδειγμα

Ας ξεκινήσουμε με ένα από τα πιο συνηθισμένα προβλήματα στη JavaScript και το TypeScript: τη διαχείριση πιθανώς null ή undefined τιμών.

Το Πρόβλημα: Ανεπιθύμητα Nulls

Φανταστείτε μια συνάρτηση που δέχεται ένα προαιρετικό αντικείμενο χρήστη και θέλει να καταγράψει το όνομα του χρήστη. Οι αυστηροί έλεγχοι null του TypeScript θα μας προειδοποιήσουν σωστά για ένα πιθανό σφάλμα.


interface User {
  name: string;
  email: string;
}

function logUserName(user: User | undefined) {
  // 🚨 Σφάλμα TypeScript: το 'user' είναι πιθανώς 'undefined'.
  console.log(user.name.toUpperCase()); 
}

Ο τυπικός τρόπος για να το διορθώσετε αυτό είναι με έναν έλεγχο if:


function logUserName(user: User | undefined) {
  if (user) {
    // Μέσα σε αυτό το μπλοκ, το TypeScript γνωρίζει ότι το 'user' είναι τύπου 'User'.
    console.log(user.name.toUpperCase());
  } else {
    console.error('Ο χρήστης δεν παρέχεται.');
  }
}

Αυτό λειτουργεί, αλλά τι γίνεται αν το να είναι το `user` `undefined` αποτελεί ένα μη αναστρέψιμο σφάλμα σε αυτό το πλαίσιο; Δεν θέλουμε η συνάρτηση να συνεχίσει σιωπηλά. Θέλουμε να αποτύχει ηχηρά. Αυτό οδηγεί σε επαναλαμβανόμενες ρήτρες προστασίας (guard clauses).

Η Λύση: Μια Συνάρτηση Επιβεβαίωσης `assertIsDefined`

Ας δημιουργήσουμε μια επαναχρησιμοποιήσιμη συνάρτηση επιβεβαίωσης για να χειριστούμε αυτό το μοτίβο κομψά.


// Η επαναχρησιμοποιήσιμη συνάρτηση επιβεβαίωσής μας
function assertIsDefined<T>(value: T, message: string = "Η τιμή δεν έχει οριστεί"): asserts value is NonNullable<T> {
  if (value === undefined || value === null) {
    throw new Error(message);
  }
}

// Ας τη χρησιμοποιήσουμε!
interface User {
  name: string;
  email: string;
}

function logUserName(user: User | undefined) {
  assertIsDefined(user, "Το αντικείμενο User πρέπει να παρέχεται για την καταγραφή του ονόματος.");

  // Κανένα σφάλμα! Το TypeScript γνωρίζει τώρα ότι το 'user' είναι τύπου 'User'.
  // Ο τύπος έχει στενέψει από 'User | undefined' σε 'User'.
  console.log(user.name.toUpperCase());
}

// Παράδειγμα χρήσης:
const validUser = { name: 'Alice', email: 'alice@example.com' };
logUserName(validUser); // Καταγράφει "ALICE"

const invalidUser = undefined;
try {
  logUserName(invalidUser); // Προκαλεί Error: "Το αντικείμενο User πρέπει να παρέχεται για την καταγραφή του ονόματος."
} catch (error) {
  console.error(error.message);
}

Αποδομώντας την Υπογραφή της Επιβεβαίωσης

Ας αναλύσουμε την υπογραφή: asserts value is NonNullable<T>

Πρακτικές Περιπτώσεις Χρήσης για τις Συναρτήσεις Επιβεβαίωσης

Τώρα που καταλαβαίνουμε τα βασικά, ας εξερευνήσουμε πώς να εφαρμόσουμε τις συναρτήσεις επιβεβαίωσης για να λύσουμε συνήθη, πραγματικά προβλήματα. Είναι πιο ισχυρές στα όρια της εφαρμογής σας, όπου εξωτερικά, ατυποποίητα δεδομένα εισέρχονται στο σύστημά σας.

Περίπτωση Χρήσης 1: Επικύρωση Αποκρίσεων API

Αυτή είναι αναμφισβήτητα η πιο σημαντική περίπτωση χρήσης. Τα δεδομένα από ένα αίτημα fetch είναι εγγενώς μη αξιόπιστα. Το TypeScript σωστά τυποποιεί το αποτέλεσμα του `response.json()` ως `Promise` ή `Promise`, αναγκάζοντάς σας να το επικυρώσετε.

Το Σενάριο

Ανακτούμε δεδομένα χρήστη από ένα API. Αναμένουμε να ταιριάζουν με το interface μας `User`, αλλά δεν μπορούμε να είμαστε σίγουροι.


interface User {
  id: number;
  name: string;
  email: string;
}

// Ένας κανονικός type guard (επιστρέφει boolean)
function isUser(data: unknown): data is User {
  return (
    typeof data === 'object' &&
    data !== null &&
    'id' in data && typeof (data as any).id === 'number' &&
    'name' in data && typeof (data as any).name === 'string' &&
    'email' in data && typeof (data as any).email === 'string'
  );
}

// Η νέα μας συνάρτηση επιβεβαίωσης
function assertIsUser(data: unknown): asserts data is User {
  if (!isUser(data)) {
    throw new TypeError('Λήφθηκαν μη έγκυρα δεδομένα User από το API.');
  }
}

async function fetchAndProcessUser(userId: number) {
  const response = await fetch(`https://api.example.com/users/${userId}`);
  const data: unknown = await response.json();

  // Επιβεβαιώστε τη μορφή των δεδομένων στο όριο
  assertIsUser(data);

  // Από αυτό το σημείο και μετά, το 'data' είναι με ασφάλεια τυποποιημένο ως 'User'.
  // Δεν χρειάζονται πλέον έλεγχοι 'if' ή type casting!
  console.log(`Επεξεργασία χρήστη: ${data.name.toUpperCase()} (${data.email})`);
}

fetchAndProcessUser(1);

Γιατί αυτό είναι ισχυρό: Καλώντας το `assertIsUser(data)` αμέσως μετά τη λήψη της απάντησης, δημιουργούμε μια «πύλη ασφαλείας». Οποιοσδήποτε κώδικας ακολουθεί μπορεί με σιγουριά να αντιμετωπίσει το `data` ως `User`. Αυτό αποσυνδέει τη λογική επικύρωσης από την επιχειρησιακή λογική, οδηγώντας σε πολύ καθαρότερο και πιο ευανάγνωστο κώδικα.

Περίπτωση Χρήσης 2: Διασφάλιση της Ύπαρξης Μεταβλητών Περιβάλλοντος

Οι server-side εφαρμογές (π.χ., στο Node.js) βασίζονται σε μεγάλο βαθμό σε μεταβλητές περιβάλλοντος για τη διαμόρφωση. Η πρόσβαση στο `process.env.MY_VAR` δίνει έναν τύπο `string | undefined`. Αυτό σας αναγκάζει να ελέγχετε για την ύπαρξή του παντού όπου το χρησιμοποιείτε, κάτι που είναι κουραστικό και επιρρεπές σε σφάλματα.

Το Σενάριο

Η εφαρμογή μας χρειάζεται ένα κλειδί API και μια διεύθυνση URL βάσης δεδομένων από τις μεταβλητές περιβάλλοντος για να ξεκινήσει. Αν λείπουν, η εφαρμογή δεν μπορεί να εκτελεστεί και θα πρέπει να καταρρεύσει αμέσως με ένα σαφές μήνυμα σφάλματος.


// Σε ένα αρχείο utility, π.χ., 'config.ts'

export function getEnvVar(key: string): string {
  const value = process.env[key];

  if (value === undefined) {
    throw new Error(`ΚΡΙΣΙΜΟ: Η μεταβλητή περιβάλλοντος ${key} δεν έχει οριστεί.`);
  }

  return value;
}

// Μια πιο ισχυρή έκδοση που χρησιμοποιεί επιβεβαιώσεις
function assertEnvVar(key: string): asserts key is keyof NodeJS.ProcessEnv {
  if (process.env[key] === undefined) {
    throw new Error(`ΚΡΙΣΙΜΟ: Η μεταβλητή περιβάλλοντος ${key} δεν έχει οριστεί.`);
  }
}

// Στο σημείο εισόδου της εφαρμογής σας, π.χ., 'index.ts'

function startServer() {
  // Εκτελέστε όλους τους ελέγχους κατά την εκκίνηση
  assertEnvVar('API_KEY');
  assertEnvVar('DATABASE_URL');

  const apiKey = process.env.API_KEY;
  const dbUrl = process.env.DATABASE_URL;

  // Το TypeScript γνωρίζει πλέον ότι τα apiKey και dbUrl είναι strings, όχι 'string | undefined'.
  // Η εφαρμογή σας είναι εγγυημένο ότι έχει την απαιτούμενη διαμόρφωση.
  console.log('Μήκος κλειδιού API:', apiKey.length);
  console.log('Σύνδεση στη ΒΔ:', dbUrl.toLowerCase());

  // ... υπόλοιπη λογική εκκίνησης του server
}

startServer();

Γιατί αυτό είναι ισχυρό: Αυτό το μοτίβο ονομάζεται «άμεση αποτυχία» (fail-fast). Επικυρώνετε όλες τις κρίσιμες διαμορφώσεις μία φορά στην αρχή του κύκλου ζωής της εφαρμογής σας. Αν υπάρχει πρόβλημα, αποτυγχάνει αμέσως με ένα περιγραφικό σφάλμα, το οποίο είναι πολύ πιο εύκολο να εντοπιστεί από μια μυστηριώδη κατάρρευση που συμβαίνει αργότερα όταν τελικά χρησιμοποιηθεί η μεταβλητή που λείπει.

Περίπτωση Χρήσης 3: Εργασία με το DOM

Όταν κάνετε ένα query στο DOM, για παράδειγμα με το `document.querySelector`, το αποτέλεσμα είναι `Element | null`. Αν είστε βέβαιοι ότι ένα στοιχείο υπάρχει (π.χ., το κύριο `div` ρίζας της εφαρμογής), ο συνεχής έλεγχος για `null` μπορεί να είναι громіздкий.

Το Σενάριο

Έχουμε ένα αρχείο HTML με `

`, και το script μας πρέπει να επισυνάψει περιεχόμενο σε αυτό. Ξέρουμε ότι υπάρχει.


// Επαναχρησιμοποιώντας τη γενική μας επιβεβαίωση από νωρίτερα
function assertIsDefined<T>(value: T, message: string = "Η τιμή δεν έχει οριστεί"): asserts value is NonNullable<T> {
  if (value === undefined || value === null) {
    throw new Error(message);
  }
}

// Μια πιο συγκεκριμένη επιβεβαίωση για στοιχεία DOM
function assertQuerySelector<T extends Element>(selector: string, constructor?: new () => T): T {
  const element = document.querySelector(selector);
  assertIsDefined(element, `ΚΡΙΣΙΜΟ: Στοιχείο με selector '${selector}' δεν βρέθηκε στο DOM.`);

  // Προαιρετικά: έλεγχος αν είναι το σωστό είδος στοιχείου
  if (constructor && !(element instanceof constructor)) {
    throw new TypeError(`Το στοιχείο '${selector}' δεν είναι μια περίπτωση του ${constructor.name}`);
  }

  return element as T;
}

// Χρήση
const appRoot = document.querySelector('#app-root');
assertIsDefined(appRoot, 'Δεν ήταν δυνατή η εύρεση του κύριου στοιχείου ρίζας της εφαρμογής.');

// Μετά την επιβεβαίωση, το appRoot είναι τύπου 'Element', όχι 'Element | null'.
appRoot.innerHTML = '

Hello, World!

'; // Χρησιμοποιώντας τον πιο συγκεκριμένο βοηθό const submitButton = assertQuerySelector<HTMLButtonElement>('#submit-btn', HTMLButtonElement); // το 'submitButton' είναι τώρα σωστά τυποποιημένο ως HTMLButtonElement submitButton.disabled = true;

Γιατί αυτό είναι ισχυρό: Σας επιτρέπει να εκφράσετε μια αναλλοίωτη (invariant)—μια συνθήκη που ξέρετε ότι είναι αληθής—για το περιβάλλον σας. Αφαιρεί τον θορυβώδη κώδικα ελέγχου για null και τεκμηριώνει με σαφήνεια την εξάρτηση του script από μια συγκεκριμένη δομή DOM. Αν η δομή αλλάξει, λαμβάνετε ένα άμεσο, σαφές σφάλμα.

Συναρτήσεις Επιβεβαίωσης εναντίον των Εναλλακτικών

Είναι κρίσιμο να γνωρίζετε πότε να χρησιμοποιείτε μια συνάρτηση επιβεβαίωσης έναντι άλλων τεχνικών στένωσης τύπου, όπως οι type guards ή το type casting.

Τεχνική Σύνταξη Συμπεριφορά σε Αποτυχία Ιδανικό για
Type Guards value is Type Επιστρέφει false Ροή ελέγχου (if/else). Όταν υπάρχει μια έγκυρη, εναλλακτική διαδρομή κώδικα για την «αρνητική» περίπτωση. Π.χ., «Αν είναι string, επεξεργάσου το· αλλιώς, χρησιμοποίησε μια προεπιλεγμένη τιμή».
Συναρτήσεις Επιβεβαίωσης asserts value is Type Προκαλεί Error Επιβολή αναλλοίωτων. Όταν μια συνθήκη πρέπει να είναι αληθής για να συνεχίσει σωστά το πρόγραμμα. Η «αρνητική» διαδρομή είναι ένα μη αναστρέψιμο σφάλμα. Π.χ., «Η απάντηση του API πρέπει να είναι ένα αντικείμενο User».
Type Casting value as Type Καμία επίδραση στο runtime Σπάνιες περιπτώσεις όπου εσείς, ο προγραμματιστής, γνωρίζετε περισσότερα από τον μεταγλωττιστή και έχετε ήδη πραγματοποιήσει τους απαραίτητους ελέγχους. Προσφέρει μηδενική ασφάλεια στο runtime και πρέπει να χρησιμοποιείται με φειδώ. Η υπερβολική χρήση είναι ένα «code smell».

Βασική Κατευθυντήρια Γραμμή

Ρωτήστε τον εαυτό σας: "Τι πρέπει να συμβεί αν αυτός ο έλεγχος αποτύχει;"

Προηγμένα Μοτίβα και Βέλτιστες Πρακτικές

1. Δημιουργήστε μια Κεντρική Βιβλιοθήκη Επιβεβαιώσεων

Μη διασκορπίζετε συναρτήσεις επιβεβαίωσης σε όλη τη βάση κώδικά σας. Συγκεντρώστε τις σε ένα ειδικό αρχείο utility, όπως το src/utils/assertions.ts. Αυτό προάγει την επαναχρησιμοποίηση, τη συνέπεια και καθιστά τη λογική επικύρωσής σας εύκολη στην εύρεση και τον έλεγχο.


// src/utils/assertions.ts

export function assert(condition: unknown, message: string): asserts condition {
  if (!condition) {
    throw new Error(message);
  }
}

export function assertIsDefined<T>(value: T): asserts value is NonNullable<T> {
  assert(value !== null && value !== undefined, 'Αυτή η τιμή πρέπει να είναι ορισμένη.');
}

export function assertIsString(value: unknown): asserts value is string {
  assert(typeof value === 'string', 'Αυτή η τιμή πρέπει να είναι string.');
}

// ... και ούτω καθεξής.

2. Χρησιμοποιήστε Σημαντικά Μηνύματα Σφάλματος

Το μήνυμα σφάλματος από μια αποτυχημένη επιβεβαίωση είναι η πρώτη σας ένδειξη κατά την αποσφαλμάτωση. Κάντε το να μετράει! Ένα γενικό μήνυμα όπως «Η επιβεβαίωση απέτυχε» δεν είναι χρήσιμο. Αντ' αυτού, παρέχετε πλαίσιο:


function assertIsUser(data: unknown): asserts data is User {
  if (!isUser(data)) {
    // Κακό: throw new Error('Μη έγκυρα δεδομένα');
    // Καλό:
    throw new TypeError(`Αναμενόταν τα δεδομένα να είναι αντικείμενο User, αλλά λήφθηκε ${JSON.stringify(data)}`);
  }
}

3. Έχετε Υπόψη την Απόδοση

Οι συναρτήσεις επιβεβαίωσης είναι έλεγχοι runtime, που σημαίνει ότι καταναλώνουν κύκλους CPU. Αυτό είναι απολύτως αποδεκτό και επιθυμητό στα όρια της εφαρμογής σας (είσοδος API, φόρτωση διαμόρφωσης). Ωστόσο, αποφύγετε την τοποθέτηση πολύπλοκων επιβεβαιώσεων μέσα σε κρίσιμες για την απόδοση διαδρομές κώδικα, όπως ένας στενός βρόχος που εκτελείται χιλιάδες φορές το δευτερόλεπτο. Χρησιμοποιήστε τις εκεί όπου το κόστος του ελέγχου είναι αμελητέο σε σύγκριση με τη λειτουργία που εκτελείται (όπως ένα αίτημα δικτύου).

Συμπέρασμα: Γράφοντας Κώδικα με Αυτοπεποίθηση

Οι συναρτήσεις επιβεβαίωσης του TypeScript είναι κάτι περισσότερο από ένα εξειδικευμένο χαρακτηριστικό· είναι ένα θεμελιώδες εργαλείο για τη συγγραφή στιβαρών, επαγγελματικού επιπέδου εφαρμογών. Σας δίνουν τη δυνατότητα να γεφυρώσετε το κρίσιμο χάσμα μεταξύ της θεωρίας του compile-time και της πραγματικότητας του runtime.

Υιοθετώντας τις συναρτήσεις επιβεβαίωσης, μπορείτε να:

Την επόμενη φορά που θα ανακτήσετε δεδομένα από ένα API, θα διαβάσετε ένα αρχείο διαμόρφωσης ή θα επεξεργαστείτε την είσοδο του χρήστη, μην κάνετε απλώς cast τον τύπο και ελπίζετε για το καλύτερο. Επιβεβαιώστε το. Χτίστε μια πύλη ασφαλείας στην άκρη του συστήματός σας. Ο μελλοντικός σας εαυτός —και η ομάδα σας— θα σας ευχαριστούν για τον στιβαρό, προβλέψιμο και ανθεκτικό κώδικα που γράψατε.