DedSec Project

TS2339 — DedSec Project

TS2339 — διάκρινε την παραλλαγή πριν διαβάσεις ειδική ιδιότητα Αρχική αιτία Το TS2339 εμφανίζεται όταν η ιδιότητα δεν υπάρχει στον στατικό τύπο που χειρίζεσαι. Σε έναν σύνθετο τύπο union η…

TS2339 — διάκρινε την παραλλαγή πριν διαβάσεις ειδική ιδιότητα

Αρχική αιτία

Το TS2339 εμφανίζεται όταν η ιδιότητα δεν υπάρχει στον στατικό τύπο που χειρίζεσαι. Σε έναν σύνθετο τύπο union η ιδιότητα μπορεί να υπάρχει σε μία παραλλαγή και να λείπει από άλλη. Για παράδειγμα, μία κίνηση αφής έχει συντεταγμένες x/y, ενώ μία πληκτρολόγηση έχει κείμενο. Η ανάγνωση event.x χωρίς έλεγχο της παραλλαγής είναι λανθασμένη.

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

Χρησιμοποίησε discriminated union με πεδίο kind. Ο έλεγχος event.kind === 'tap' περιορίζει τον τύπο στην παραλλαγή με x και y, ενώ η άλλη περίπτωση χρησιμοποιεί το text. Οι δύο διαδρομές ελέγχονται σε κανονική εκτέλεση και με --strict.

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

type UiEvent = {kind: 'tap'; x: number; y: number} | {kind: 'type'; text: string};
function render(event: UiEvent): string {
  if (event.kind === 'tap') return `tap at ${event.x},${event.y}`;
  return `typed ${event.text}`;
}
if (render({kind: 'tap', x: 2, y: 3}) !== 'tap at 2,3') throw Error();
if (render({kind: 'type', text: 'ok'}) !== 'typed ok') throw Error();
console.log('PASS TS2339');

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

Η προσθήκη δυναμικής ιδιότητας σε αντικείμενο JavaScript δεν ενημερώνει αυτόματα τη δήλωση τύπου. Το optional chaining δεν διορθώνει μία ιδιότητα που δεν υπάρχει σε κανένα μέλος του δηλωμένου τύπου. Το as any αποκρύπτει το πραγματικό πρόβλημα και μπορεί να οδηγήσει σε crash αργότερα.

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

Αποθήκευσε ως main.ts και εκτέλεσε tsc --strict --target es2022 --module commonjs --outDir dist main.ts && node dist/main.js. Αναμένεται PASS. Σε χωριστό bad.ts δήλωσε τον ίδιο UiEvent και γράψε function wrong(e: UiEvent) { return e.x; }. Η μεταγλώττιση πρέπει να δείξει TS2339.

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

Πρόσθεσε παραλλαγή 'scroll' και χειρίσου την με πλήρες switch και never στην απρόβλεπτη περίπτωση. Δοκίμασε την ανορθόγραφη ιδιότητα event.txt. Σύγκρινε τον έλεγχο kind με την υπόθεση ότι μια ιδιότητα υπάρχει επειδή είναι truthy.

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