typescript - Varför är arrayåtkomstoperatorn ([]) på objekt inte ett fel?
När jag refaktoriserade min kod stötte jag på ett konstigt beteende hos TypeScript-kompilatorn som jag inte förstår.
interface IPoint {
x: number;
y: number;
}
let a: IPoint = { x: 5, y: 10 };
let b = a[0];
console.log(b);
När jag kompilerar denna kod skulle jag förvänta mig att kompilatorn ger ett fel på grund av att man försöker komma åt en nyckel i a som definitivt inte existerar (vid kompileringstid).
Varför är det så? Finns det alternativt ett TSLint-alternativ som jag inte känner till som markerar [] som används på objekt som fel/varning?
Med vänliga hälsningar och tack på förhand
Svar #1
Jag rekommenderar starkt att slå på --strict-kompilatoralternativet. Detta alternativ aktiverar en mängd extra kontroller som är ovärderliga för att fånga fel. I ditt fall utförs den specifika kontroll du vill ha via --noImplicitAny-alternativet:
--noImplicitAny: Generera fel på uttryck och deklarationer med en underförståddany-typ.
Om du slår på det kommer du att se följande felmeddelande:
let b = a[0]; // error!
// Element implicitly has an 'any' type because type 'IPoint' has no index signature.
Du kan upptäcka att om du slår på --strict-läge, dyker många andra fel upp. Det är irriterande, men generellt är det bra fel som du bör hantera, och även när falska positiva visas, kommer hantering av dessa fel att göra din kod bättre.
Hoppas det hjälper; lycka till!
Svar #2
Med standardinställningarna för kompilatorn tillåter TypeScript indexeringsoperationer på vilket objekt som helst med vilken nyckel som helst (och resultatet kommer att vara av typen any). För att göra detta till ett fel, använd kompilatoralternativet noImplicitAny.
