Kan TypeScript varna mig för överflödiga användningar av icke-null-försäkringsoperatorn?
Beakta följande TypeScript-kod:
let x = { foo: { bar: "baz" } };
console.log(x.foo!.bar);
Här är den härledda typen av x.foo { bar: string }, och det finns alltså inget behov av att använda operatorn för icke-null-assertion ! (se t.ex. https://github.com/Microsoft/TypeScript/issues/7395): kompilatorn vet redan att x.foo inte kan vara null.
Kan tsc (eller möjligen ett mycket använt tredjepartsverktyg som TSLint) varna mig om dessa överflödiga användningar av !, och/eller är detta en planerad funktion?
Jag är säker på att detta är genomförbart i princip (det verkar som om det här bara skulle vara en fråga om att använda TypeScript-kompilatorns API för att identifiera platser där ! används på variabler vars typ inte är T | null eller T | undefined); jag undrar bara om det tunga arbetet redan har gjorts. Eller, antar jag, en pekare till de relevanta delarna av TypeScript-kompilatorns API skulle också fungera - det är svårt att hitta dokumentation för det (antar jag eftersom det ännu inte är stabilt).
(Anledningen till att jag frågar är att jag är orolig för att jag kommer att behöva hantera kod där tidigare jag någon idiot strött ! överallt för att få tsc --strictNullChecks att sluta ge fel, utan att faktiskt tänka på om den påstådda variabeln verkligen kommer vara icke-null vid körning. Om den faktiskt blir null vid körning, voilà! Ett fel som vi hade kunnat fånga vid kompilering, men inte gjorde på grund av överdriven användning av !. Förekomsten av ! på variabler som redan är kända för att vara icke-null skulle starkt antyda att koden överanvänder !, troligen felaktigt.)
Svar #1
TSLint gör detta nu via regeln no-unnecessary-type-assertion.
Kod som denna:
const x: string = "foo";
const y = x!.indexOf("f"); // <-- x is of type string; no need to assert non-null
Kommer att utlösa en varning något i stil med detta:
This assertion is unnecessary since it does not change the type of the expression.
Svar #2
Nej, det verkar inte som att det för närvarande kan. I syfte att komma in i kompilatorns kodbas fick jag det att göra det på min fork här: https://github.com/Sheeo/TypeScript/commit/e6d1651e4d28493b6e5f20d027ad8e86f7451552
Du kan köra det genom att klona repot och använda den versionen av kompilatorn -- kom ihåg att aktivera strictNullChecks :)
