Överskottsegenskaper i TypeScript
Egenskaper som definieras på ett objekt och som inte uttrycks av objektets typ kallas överskottsegenskaper.
Här är ett exempel:
type Person = {
firstName: string
}
const person: Person = {
firstName: "Filip",
lastName: "Tammergård", // ⛔️ Object literal may only specify known properties, and 'lastName' does not exist in type 'Person'.
}
I det här fallet gör TypeScript det tydligt att lastName inte är definierad i Person-typen och därför inte är tillåten.
Men i andra fall kontrollerar TypeScript inte överskottsegenskaper:
type Person = {
firstName: string
}
const personDetails = {
lastName: "Tammergård",
}
const person: Person = {
firstName: "Filip",
...personDetails, // 👍 Det här går bra!
}
Det här är, enligt mig, en ganska märklig sak med TypeScript – men det är väl dokumenterat.
Observera att det inte specifikt handlar om spread-syntaxen, utan snarare att TypeScript inte kör överskottskontroller på objekt när de definieras separat.
Här är ett annat exempel:
type Person = {
firstName: string
}
function printPerson(p: Person) {
console.log(p.firstName)
}
printPerson({
firstName: "Filip",
lastName: "Tammergård", // ⛔️ Object literal may only specify known properties, and 'lastName' does not exist in type 'Person'.
})
I det här fallet ger TypeScript fel när lastName skickas in, eftersom det inte ingår i funktionsparametertyperna.
Vi tilldelar objektet till en variabel och skickar in den till printPerson i stället:
type Person = {
firstName: string
}
function printPerson(p: Person) {
console.log(p.firstName)
}
const person = {
firstName: "Filip",
lastName: "Tammergård",
}
printPerson(person) // 👍 Det här går bra!
Att TypeScript har ett strukturellt typsystem innebär att det kontrollerar minimi-krav snarare än exakta krav – åtminstone i vissa fall.
Anledningen till att TypeScript gör överskottskontroller när man skickar in ett "inline"-objekt är förmodligen att det inte kommer användas någon annanstans och TypeScript kan anta att överskottsegenskapen är ett misstag.
