inkapsling - TypeScript-kompilatorn tillåter att man anropar en icke-existerande getter. Är detta ett fel i kompilatorn?


Kort sagt, jag är mycket förvirrad över varför denna kod kompileras utan fel:

class Foobar {
    #data = 0
    set data(val: number) { this.#data = val }
    // (Notice there is no getter for "data")
}
let foobar = new Foobar()
// Call the setter for data, no problemo
foobar.data = 123
// Call the getter for data, compiler should not allow this imo
console.log(foobar.data) // Prints "undefined"
  1. Är detta en bugg i TypeScript-kompilatorn? Jag kan inte hitta någonstans där detta problem nämns. Eller fungerar mitt exempel som avsett (missade jag något?).
  2. Finns det något sätt (med eslint-regler eller tsc) att fånga denna felaktiga kod?

Svar #1

Det finns ett relaterat men inte exakt samma problem i TypeScript github-repo och svaret är att detta är det definierade ES6-klassbeteendet.

Det finns en linterregel för att kontrollera att du har en setter utan getter eller setter utan getter. Jag vet inte om det finns någon regel som kontrollerar att man anropar en getter som inte finns. Men du kan definiera en getter som kastar ett fel, så åtminstone vid körning kommer du att se fel och enhetstester skulle misslyckas.

Relaterade artiklar