undefined - uinitialisert variabel fungerer som en løsning på strictNullChecks i TypeScript
Vurder denne MRE-en:
let foo: string;
function test() {
console.log(foo.trim())
}
test()
Jeg bruker strictNullChecks-alternativet i TSConfig. Jeg forventet feilen 'foo' er muligens 'undefined' fra kompilatoren. Men jeg får den bare ved kjøring:
TypeError: Kan ikke lese egenskaper av undefined (leser 'trim')
Hvorfor klager ikke TSConfig-kompilatoren? Hvorfor er jeg ikke pålagt å typisere den uinitialiserte variabelen som string | undefined?
Ingen kompilasjonsfeil her heller:
module1
export let foo: string;
module2
import { foo } from 'module1';
console.log(foo.trim());
Jeg vet hvordan jeg kan håndheve typekontroll for undefined, men spørsmålet mitt er heller hvorfor TypeScript ikke gjør det, jeg trodde det var en del av jobben hans!
REDIGER: Som observert av @matthieu-riegler, oppfører det seg som forventet når variabelen ikke er erklært som en toppnivåvariabel. Men det ser faktisk ut til at det oppfører seg som forventet bare når variabelen er erklært på samme «nivå» som anropsstedet, fordi dette heller ikke gir noen kompilatorfeil:
function test() {
let foo: string;
function test2() {
console.log(foo.trim())
}
}
test()
Svar #1
Det er et åpent problem på det i Typescript-repositoriet.
Dette spørsmålet, selv om det er gammelt, har blitt diskutert nylig i et designmøte.
Det er en åpen PR for å "fikse" dette ved å kaste en feil når variabler brukes, men aldri initialiseres.
Du kan også legge merke til at dette bare er et problem for "top-nivå" let-variabler.