DedSec Project

TS7006 — DedSec Project

TS7006 — παράμετρος με αδήλωτο any Αρχική αιτία Το TS7006 εμφανίζεται όταν μία παράμετρος αποκτά σιωπηρά τύπο any ενώ είναι ενεργό το noImplicitAny, όπως όταν χρησιμοποιείται --strict . Η…

TS7006 — παράμετρος με αδήλωτο any

Αρχική αιτία

Το TS7006 εμφανίζεται όταν μία παράμετρος αποκτά σιωπηρά τύπο any ενώ είναι ενεργό το noImplicitAny, όπως όταν χρησιμοποιείται --strict. Η έκφραση const convert = (value) => value + 1 δεν ξεκαθαρίζει αν περιμένει αριθμό ή κείμενο· η πράξη μπορεί να γίνει πρόσθεση ή συνένωση. Η απενεργοποίηση του strict κρύβει την προειδοποίηση αλλά δεν αποδεικνύει ορθότητα.

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

Δήλωσε τύπο συνάρτησης (raw: string) => number και ανάθεσε σε αυτόν το callback. Η contextual typing επιτρέπει στην TypeScript να συμπεράνει ότι το raw είναι string χωρίς δεύτερη επανάληψη τύπου. Το πρόγραμμα επαληθεύει ακέραια θύρα από 1 έως 65535 με αυστηρό έλεγχο ψηφίων.

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

type Parser = (raw: string) => number;
const parsePort: Parser = (raw) => {
  const port = Number(raw);
  if (!/^[0-9]+$/.test(raw) || !Number.isInteger(port) || port < 1 || port > 65535)
    throw new RangeError('port out of range');
  return port;
};
if (parsePort('3000') !== 3000) throw Error();
try { parsePort('0'); throw Error('accepted invalid port'); }
catch (err) { if (!(err instanceof RangeError)) throw err; }
console.log('PASS TS7006');

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

Ο στατικός τύπος δεν επικυρώνει δεδομένα όταν τρέχει η JavaScript. Ελέγχουμε το αρχικό κείμενο και όχι μόνο τη μετατροπή Number(raw), επειδή το Number('') γίνεται μηδέν. Για μη έμπιστα δεδομένα από JSON ξεκίνησε από unknown και έλεγξε τον τύπο πριν την επεξεργασία· το any παρακάμπτει τον έλεγχο.

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

Αποθήκευσε ως main.ts και εκτέλεσε tsc --strict --target es2022 --module commonjs --outDir dist main.ts && node dist/main.js. Σε χωριστό bad.ts γράψε const convert = (value) => value + 1; και τρέξε tsc --strict --noEmit bad.ts. Αναμένεται TS7006.

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

Σύγκρινε μία παράμετρο input: unknown με την παράμετρο string της parsePort και πρόσθεσε σωστό narrowing. Δοκίμασε map((x) => x * 2) σε πίνακα number, όπου η TypeScript συμπεραίνει τον τύπο, και μία ανεξάρτητη συνάρτηση χωρίς πλαίσιο τύπου.

Τεκμηρίωση: https://www.typescriptlang.org/tsconfig/noImplicitAny.html