Varför fångar inte TypeScript att en const används innan tilldelning?


Jag har ett mycket enkelt exempel där TypeScript (3.5.1) är okej med koden, men det kastar omedelbart ett fel när det körs.

Jag tror att problemet här är att i princip value är deklarerat men inte initialiserat innan getValue körs. Detta är ganska ologiskt enligt mig men jag förstår att det är så JS fungerar.

Men varför kan inte TS upptäcka detta problem i ett så enkelt exempel? Eftersom value är en konstans verkar det för mig som att TS borde kunna bestämma exakt när det sätts och förutse att denna kod kraschar.

console.log(getValue());

const value = "some string";

function getValue() {
  return value;
}

I ett andra exempel utan ett funktionsanrop, fångar TS att variabeln används innan tilldelning:

console.log(value);
const value = "some string";

TSLints no-use-before-declare verkar inte heller vara tillämplig.

Om man antar att TS/linting inte kommer att kunna fånga detta, finns det en bästa praxis att tillämpa i det initiala exemplet som kommer att undvika denna krasch? "Deklarera alltid modulnivå-konstanter högst upp i filen" till exempel.

Svar #1

Du kan aktivera tslints only-arrow-functions och sedan ersätta din function getValue() med

const getValue = function(): string {
  return value;
}

eller till och med

const getValue = (): string => value;

Vid det laget kommer din första rad att vara ett kompilatorfel:

Block-scoped variable 'getValue' used before its declaration

Svar #2

Jag tror att pilfunktionssvaret ovan besvarar din fråga bäst, men som en parentes: att bestämma ett strikt arbetsflöde kommer också att förhindra hoisting-fel: deklarera variabler, deklarera funktioner, kalla init-funktionen:

const value = "some string"

function startApp() { 
    console.log(getValue());
}

function getValue() {
    console.log("yo " + value)
    return value;
}

startApp()

Relaterade artiklar