TS2322 — DedSec Project
TS2322 — τιμή ασύμβατη με τον δηλωμένο τύπο Αρχική αιτία Το TS2322 σημαίνει ότι ένας τύπος δεν μπορεί να αποθηκευτεί σε μεταβλητή άλλου τύπου, όπως ένα ποσό σε μορφή συμβολοσειράς μέσα σε…
TS2322 — τιμή ασύμβατη με τον δηλωμένο τύπο
Αρχική αιτία
Το TS2322 σημαίνει ότι ένας τύπος δεν μπορεί να αποθηκευτεί σε μεταβλητή άλλου τύπου, όπως ένα ποσό σε μορφή συμβολοσειράς μέσα σε αριθμητικό πεδίο. Η TypeScript δεν μετατρέπει αυτόματα τα κείμενα, γιατί τα '12', '12x', το κενό και ένας υπερβολικά μεγάλος αριθμός έχουν διαφορετική πραγματική συμπεριφορά. Η δήλωση as number αποκρύπτει το σφάλμα του compiler αλλά δεν μετατρέπει την τιμή σε αριθμό.
Πρακτική διόρθωση
Δημιούργησε συνάρτηση που δέχεται unknown, ελέγχει ψηφία και μετατρέπει με Number. Πριν δημιουργήσεις Entry απόρριψε μη ασφαλείς ακεραίους. Στο συγκεκριμένο παράδειγμα οι τιμές αποθηκεύονται σε ακέραια λεπτά, ώστε το μοντέλο να μην ανακατεύει κείμενο και float.
Επαληθευμένο παράδειγμα TypeScript
type Entry = { id: string; cents: number };
function parseCents(value: unknown): number {
if (typeof value !== 'string' || !/^(0|[1-9][0-9]*)$/.test(value))
throw new TypeError('expected nonnegative integer cents as text');
const amount = Number(value);
if (!Number.isSafeInteger(amount)) throw new RangeError('outside safe integer range');
return amount;
}
const entry: Entry = {id: 'sample', cents: parseCents('150')};
if (entry.cents !== 150) throw Error('bad conversion');
console.log('PASS TS2322');
Γιατί λειτουργεί
Οι τύποι TypeScript δεν υπάρχουν πια κατά την εκτέλεση JavaScript. Η κανονική έκφραση απορρίπτει αρνητικά και μη κανονική γραφή με αρχικό μηδέν λόγω του συμβολαίου της άσκησης, όχι ως καθολικό κανόνα. Η Number.isSafeInteger ελέγχει αν ένας ακέραιος αναπαρίσταται ακριβώς. Για πολύ μεγάλα ποσά χρειάζεται διαφορετική αναπαράσταση, όπως BigInt ή εξειδικευμένο δεκαδικό σύστημα.
Εντολές ελέγχου
Αποθήκευσε ως main.ts και εκτέλεσε tsc --strict --target es2022 --module commonjs --outDir dist main.ts && node dist/main.js. Αναμένεται PASS. Σε ξεχωριστό bad.ts γράψε const cents: number = '100'; και βεβαιώσου ότι η tsc --strict --noEmit bad.ts αναφέρει TS2322. Μη βάζεις το εσκεμμένα αποτυχημένο αρχείο στη συνηθισμένη μεταγλώττιση.
Ασκήσεις διάγνωσης
Δοκίμασε '0', '01', '10.5', '-1', 'abc' και '9007199254740992'. Πρόβλεψε ποια απορρίπτονται. Σύγκρινε το Number('') με τον ελεγχόμενο μετατροπέα και εξήγησε γιατί η αυτόματη μετατροπή δεν είναι επαλήθευση δεδομένων.
Τεκμηρίωση: https://www.typescriptlang.org/docs/handbook/2/everyday-types.html