typescript2.3 - Typescript fångar inte typfel för `state` utanför konstruktorn?
I bilden ovan har jag satt standardvärden för state felaktigt (this_is_not_ok är inte en del av State-gränssnittet). Tycks inte tycka Typescript att det gör något, dock. Ett sätt att lösa problemet var att uttryckligen lägga till en typkommentar.
Jag skulle också kunna lösa problemet genom att använda en constructor():
constructor(){ super(); this.state={stavefel: "fel"}; }
Varför fungerade inte typavledning i det första exemplet?
Svar #1
Jag har ställt in standardvärden för tillståndet på fel sätt
Du har inte ställt in värdena felaktigt. Du har helt enkelt skrivit en klass som har mer tillstånd än basklassen, vilket inte är ett fel per se. När du skriver en härledd klass kan du ha mer saker än din basklass.
När du skriver en klassens egenskapsinitierare utan en typanteckning, härleder TypeScript typen för egenskapen baserat på initieraren:
interface Bar {
stuff: { x: number }
}
class Foo implements Bar {
stuff = {
x: 10, y: 3
}
}
const f = new Foo();
console.log(f.stuff.y); // OK: f.stuff is of type { x: number; y: number; }
Kontrollen implements betyder helt enkelt "Se till att denna klass kan användas som gränssnittstypen". Samma sak händer för en härledd klass: eftersom du har åtminstone det som krävs av kontraktet för basklassen, är allt då i sin ordning.
Om du har en explicit typannotering, eller gör initialiseringen i konstruktorn, då gäller de allmänna reglerna för att tilldela ett objektliteral - inga extra egenskaper tillåtna.
För vad det är värt, kan detta beteende ändras i en framtida version av TypeScript. Se https://github.com/Microsoft/TypeScript/issues/10570
