eslint - Typescript forhindre inferering av typer unntatt ved variabeldeklarasjon
Det finnes noen spørsmål rundt implisitte any-typer i Typescript, men ingen av dem jeg har funnet svarer på spørsmålet mitt.
Si at jeg har dette:
let thing;
thing = 'someValue';
thing = 'someOtherValue';
Variabelen thing vil nå ha typen any.
Hvordan kan jeg forhindre denne situasjonen der en variabel deklareres uten en typeannotasjon OG uten å bli umiddelbart tildelt en verdi med en konkret type? Jeg bruker ESLint og fant regelen @typescript-eslint/no-unsafe-assignment, men den dekker ikke dette tilfellet.
VÆR OPPMERKSOM på at det foreslåtte duplikatet egentlig ikke svarer på spørsmålet mitt. Jeg har allerede strict aktivert i TS-kompilatoralternativene, som også aktiverer noImplicitAny, men noImplicitAny gjør ikke nok for meg.
Det jeg ønsker er å ikke få lov til å lage en variabel av typen any bortsett fra ved å eksplisitt annotere typen som any. Det er veldig upraktisk at en variabel laget nær toppen av et blokk kan få sin type inferert mange linjer lenger ned OG på flere steder, noe som betyr at IDE-en min ikke kan fortelle meg typen før etter at jeg har brukt variabelen. Jeg vil mye heller at typene mine må deklareres på tidspunktet jeg lager variabelen.
Eksempler:
// Good
let thing: string;
...
thing = 'someValue';
// Good
let thing = 'someValue';
// Good
let thing = SomeFunctionWithAnnotatedReturnType();
// Bad
// This is what I want to prevent
let thing;
...
thing = '123';
...
thing = 123;
Svar #1
Etter diskusjoner mellom mange mennesker og mye googling, foreslo jeg til slutt en Typescript ESLint-regel. Til min store overraskelse er det jeg ønsker allerede mulig med følgende ESLint-regel, som vises fungerende her:
"no-restricted-syntax": [
"error",
{
"selector": "VariableDeclaration[kind = 'let'] > VariableDeclarator[init = null]:not([id.typeAnnotation])",
"message": "Type must be inferred at variable declaration"
}
]
Jeg visste ikke at det var mulig, og det åpner opp for mange flere muligheter.
Svar #2
Jeg kan ikke legge igjen en kommentar siden jeg ikke har nok omdømme, men jeg synes spørsmålet ditt gir ikke så mye mening. Du vil ikke annotere en type eller gi den en verdi samtidig som du ikke lar den ha typen any? Hvilken type ønsker du egentlig at den skal ha når du ikke gir noen indikasjon på type?
Hvis du vil at det skal kunne ha noen få spesifikke typer senere i koden din, kan du annotere mange typer for én variabel.
let thing: string | number
På denne måten vil TypeScript tillate at thing kan være en streng eller et nummer, men ingenting annet.
