DedSec Project

TS18048 — DedSec Project

TS18048 — η πιθανότητα undefined δεν είναι θεωρητική Αρχική αιτία Το TS18048 δείχνει ότι μία τιμή μπορεί να είναι undefined. Η Array.find επιστρέφει την πρώτη εγγραφή που ταιριάζει ή…

TS18048 — η πιθανότητα undefined δεν είναι θεωρητική

Αρχική αιτία

Το TS18048 δείχνει ότι μία τιμή μπορεί να είναι undefined. Η Array.find επιστρέφει την πρώτη εγγραφή που ταιριάζει ή undefined αν καμία δεν ταιριάζει. Η άμεση ανάγνωση match.title θεωρεί ότι κάθε αναγνωριστικό υπάρχει, πράγμα που μπορεί να είναι λάθος σε κενό πίνακα, λάθος κωδικό ή αλλαγμένα δεδομένα.

Πρακτική διόρθωση

Έλεγξε match === undefined πριν προσπελάσεις ιδιότητες. Η ανάλυση ροής ελέγχου της TypeScript περιορίζει έπειτα τον τύπο στη σωστή διαδρομή. Πέτα σαφές RangeError με τον κωδικό που λείπει αντί να εμφανιστεί αργότερα τυχαίο TypeError. Το πρόγραμμα ελέγχει επιτυχημένη αναζήτηση και εσκεμμένη αποτυχία.

Επαληθευμένο παράδειγμα TypeScript

type RecordItem = {id: string; title: string};
function titleById(rows: RecordItem[], id: string): string {
  const match = rows.find((row) => row.id === id);
  if (match === undefined) throw new RangeError(`missing ID: ${id}`);
  return match.title;
}
if (titleById([{id: 'A', title: 'Intro'}], 'A') !== 'Intro') throw Error();
try { titleById([], 'B'); throw Error('accepted missing ID'); }
catch (err) { if (!(err instanceof RangeError)) throw err; }
console.log('PASS TS18048');

Γιατί λειτουργεί

Το optional chaining είναι χρήσιμο όταν η απουσία αποτελεί νόμιμο αποτέλεσμα και ο τύπος επιστροφής το δηλώνει. Αν ο τίτλος είναι υποχρεωτικός, μην επιστρέφεις αθόρυβα κενή συμβολοσειρά. Η μη μηδενική βεβαίωση (match!) αφαιρείται στη JavaScript και δεν παρέχει προστασία. Μία εγγραφή με κενό τίτλο διαφέρει από μία εγγραφή που δεν υπάρχει.

Εντολές ελέγχου

Αποθήκευσε ως main.ts και εκτέλεσε tsc --strict --target es2022 --module commonjs --outDir dist main.ts && node dist/main.js. Σε χωριστό αρχείο δήλωσε πίνακα, αναζήτησε με find και γράψε console.log(match.id) χωρίς έλεγχο. Η αναμενόμενη προειδοποίηση είναι TS18048.

Ασκήσεις διάγνωσης

Σύγκρινε με Map.get(id), που επίσης μπορεί να επιστρέψει undefined. Δημιούργησε αποτέλεσμα union {ok:true,value:...}|{ok:false,error:...} και γράψε κώδικα που ελέγχει το ok πριν χρησιμοποιήσει την τιμή.

Τεκμηρίωση: https://www.typescriptlang.org/docs/handbook/2/narrowing.html