Excess property checking helps catch mistakes when you add extra properties that are not expected. It keeps your code safe and clear.
Excess property checking behavior in Typescript
interface TypeName {
property1: Type1;
property2: Type2;
}
const obj: TypeName = {
property1: value1,
property2: value2
// extraProperty: value3, // This will cause an error
};Excess property checking happens when you assign an object literal directly to a variable or pass it as an argument.
It only checks for extra properties in object literals, not in variables or expressions.
interface Person {
name: string;
age: number;
}
const person: Person = {
name: "Alice",
age: 30,
location: "Wonderland" // Error: 'location' does not exist in type 'Person'
};interface Car {
make: string;
model: string;
}
const carDetails = {
make: "Toyota",
model: "Corolla",
year: 2020
};
const car: Car = carDetails; // No error here because carDetails is a variable, not an object literalinterface Book {
title: string;
author: string;
}
function printBook(book: Book) {
console.log(`${book.title} by ${book.author}`);
}
printBook({
title: "1984",
author: "George Orwell",
pages: 328 // Error: 'pages' does not exist in type 'Book'
});This program shows how excess property checking works. The commented-out code shows an error when an extra property is added directly in an object literal. But when the extra property is in a variable, TypeScript allows it.
interface User {
username: string;
email: string;
}
// Correct object literal
const user1: User = {
username: "john_doe",
email: "john@example.com"
};
// Object literal with extra property - causes error
// const user2: User = {
// username: "jane_doe",
// email: "jane@example.com",
// age: 25 // Error: 'age' does not exist in type 'User'
// };
// Using a variable with extra property - no error
const extraInfo = {
username: "mike",
email: "mike@example.com",
age: 40
};
const user3: User = extraInfo;
console.log(user1);
console.log(user3);Excess property checking helps catch simple mistakes like typos in property names.
You can use type assertions or index signatures to bypass excess property checks if needed, but use them carefully.
Remember, excess property checking only applies to object literals assigned directly or passed as arguments.
Excess property checking warns you about extra properties in object literals.
It helps prevent bugs by catching unexpected properties early.
It only applies to object literals, not variables or expressions.
Practice
Solution
Step 1: Understand excess property checking purpose
TypeScript checks object literals assigned to typed variables to catch unexpected properties early.Step 2: Behavior on extra properties
If the object literal has properties not in the interface, TypeScript warns to prevent bugs.Final Answer:
It warns if the object literal has properties not defined in the interface. -> Option CQuick Check:
Excess property checking warns on extra keys [OK]
- Thinking extra properties are removed automatically
- Believing excess property checking applies to variables, not literals
- Assuming runtime errors occur due to excess properties
Solution
Step 1: Identify object literal with extra property
const obj: {name: string} = {name: "Alice", age: 30}; assigns an object literal with an extra property 'age' to a type expecting only 'name'.Step 2: Check excess property rules
TypeScript flags extra properties in object literals when they don't exist in the target type.Final Answer:
const obj: {name: string} = {name: "Alice", age: 30}; -> Option AQuick Check:
Extra property 'age' causes error [OK]
- Confusing object literals with variables
- Ignoring optional properties
- Assuming all extra properties are allowed
interface Person { name: string; age: number; }
const p: Person = { name: "Bob", age: 25, city: "NY" };Solution
Step 1: Check object literal assignment to interface
The object literal has an extra property 'city' not defined in Person.Step 2: Apply excess property checking rules
TypeScript raises a compile-time error for extra properties in object literals assigned to typed variables.Final Answer:
Compilation error due to excess property 'city'. -> Option AQuick Check:
Extra property in literal causes compile error [OK]
- Thinking extra keys are ignored silently
- Expecting runtime errors instead of compile errors
- Assuming object creation succeeds with extra keys
interface Car { make: string; model: string; }
const myCar = { make: "Toyota", model: "Camry", year: 2020 };
const car: Car = myCar;Why does this code NOT cause an excess property checking error?
Solution
Step 1: Identify assignment type
The variable 'myCar' is assigned to 'car', not an object literal directly.Step 2: Understand excess property checking scope
Excess property checking only triggers on object literals, not on variables or expressions.Final Answer:
Because excess property checking only applies to object literals, not variables. -> Option BQuick Check:
Excess check skips variables [OK]
- Assuming optional properties cause errors
- Thinking all assignments trigger excess checks
- Believing extra properties cause runtime errors
interface User { username: string; }
// Which option works without error?Solution
Step 1: Understand excess property checking on object literals
Assigning an object literal with extra properties directly causes errors.Step 2: Use type assertion to bypass excess property checking
Using 'as User' tells TypeScript to trust the type, skipping excess property checks.Step 3: Analyze options
const user: User = { username: "john", age: 30 } as User; uses type assertion on the object literal, avoiding error. const user: { username: string } = { username: "john", age: 30 }; causes excess property error. const user: User = { username: "john" }; user.age = 30; tries to add property after but TypeScript errors: Property 'age' does not exist on type 'User'. const user: User = { username: "john", age: 30 }; causes excess property error.Final Answer:
const user: User = { username: "john", age: 30 } as User; -> Option DQuick Check:
Type assertion on literal skips excess check [OK]
- Trying to assign extra properties directly without assertion
- Asserting variable instead of object literal
- Adding extra properties after assignment without type update
Ready to prove it?
Pass the test and this pattern moves unknown
