typescript - Hur man blockerar implicit omvandling från `any` till en starkare typ
TypeScript tillåter implicit typomvandling från any till en starkare typ. Eftersom deserialiserad JSON är av typen any, tillåter detta beteende många typerrors och bryter typdefinitioner.
Vilka kompilator- eller lintningsalternativ kan jag använda för att blockera implicit omvandling från any till en starkare typ?
Repro Denna operation bör flaggas för att tillåta typkonvertering från any till en starkare typ.
const o = JSON.parse("");
const s: string = o.twinlakes;
Svar #1
Om du inte redan har gjort det, försök att aktivera TypeScript --noImplicitAny-kompilatorflaggan för att förhindra att deklarationer av misstag glömmer att markera typer för saker som inte kan härledas. Detta kommer att förhindra att kod som function takesData(data) { /* ... */ } tillåter att deras data-variabler ”implicit” blir av typen any.
Redigera januari 2023: det korrekta svaret är nu att använda typescript-eslint:
Dessutom finns det flera ESLint-regler från typescript-eslint som du kan använda för any-typer som kan smyga sig in även med --noImplicitAny:
@typescript-eslint/no-unsafe-argument: Förbjuder att anropa en funktion med ett värde av typen any.@typescript-eslint/no-unsafe-assignment: Tillåter inte att tilldela ett värde med typenanytill variabler och egenskaper.@typescript-eslint/no-unsafe-call: Förbjuder att anropa ett värde med typenany.@typescript-eslint/no-unsafe-member-access: Förhindrar medlemsåtkomst på ett värde med typenany.@typescript-eslint/no-unsafe-return: Blockera att returnera ett värde av typenanyfrån en funktion.
Du kan aktivera dessa regler individuellt i din ESLint-konfiguration för att använda dem i ditt projekt. Alternativt är de alla aktiverade om du utgår från plugin:@typescript-eslint/strict-konfigurationen.
Slutligen, som Titian nämner i kommentarerna, överväg att använda unknown i din kod på alla ställen där du skulle ha velat använda any. unknown är liknande any men TypeScript kommer att säkerställa att du korrekt typbegränsar unknown-värden innan du använder dem osäkert.
Svaret nedan är föråldrat eftersom TSLint är föråldrat. Se ovan för svaret med typescript-eslint.
Dessutom finns det ett par TSLint-regler som hjälper här:
no-any: Förhindrar användning avanysom typdeklaration. Använd detta för att stoppa deklarationer från att inkluderaany, t.ex.let data: any={/*...*/}.no-unsafe-any: Förbjuder att oavsiktligt användaanypå ett osäkert sätt. Detta skiljer sig frånno-anyeftersom du fortfarande kan användaany-typer utan att veta om det: till exempel,let data=JSON.parse("{}");.
Svar #2
Utöver Joshs svar, eftersom typkontrollen sker under körning, kan du försöka använda nyckelordet 'as' för att kasta värdet från 'any' till den typ du vill ha.
const o = JSON.parse("{\"twinlakes\":\"Value\"}");
const s: string=(o as any).twinlakes;
Hur det fungerar
