Type compatibility helps TypeScript check if one class can be used where another is expected. It makes your code safer and easier to work with.
Type compatibility with classes in Typescript
class ClassA { propertyA: string; } class ClassB { propertyA: string; propertyB: number; } let a: ClassA; let b: ClassB; a = b; // Allowed if ClassB has at least the properties of ClassA // b = a; // Error if ClassA lacks properties of ClassB
TypeScript uses 'structural typing', meaning compatibility depends on the shape (properties) of the classes, not their names.
Extra properties in the source class are okay when assigning to a target with fewer properties.
class Animal { name: string; } class Dog { name: string; breed: string; } let animal: Animal; let dog: Dog = { name: "Buddy", breed: "Beagle" }; animal = dog; // OK: Dog has all Animal properties // dog = animal; // Error: Animal lacks 'breed'
class Point { x: number; y: number; } class NamedPoint { x: number; y: number; name: string; } let point: Point = { x: 1, y: 2 }; let namedPoint: NamedPoint = { x: 1, y: 2, name: "A" }; point = namedPoint; // OK // namedPoint = point; // Error
This shows that an Employee can be used where a Person is expected because it has all Person's properties.
class Person { name: string; constructor(name: string) { this.name = name; } } class Employee { name: string; employeeId: number; constructor(name: string, id: number) { this.name = name; this.employeeId = id; } } let person: Person; let employee = new Employee("Alice", 123); person = employee; // OK because Employee has 'name' console.log(person.name); // Prints 'Alice' // let newEmployee: Employee = person; // Error: Person lacks 'employeeId'
Type compatibility is based on properties, not class names.
Private or protected members affect compatibility differently; only public members are checked structurally.
Be careful when assigning classes with methods; method signatures must also be compatible.
TypeScript checks if classes have matching properties to decide compatibility.
You can assign an instance of a class with more properties to a variable typed as a class with fewer properties.
Compatibility helps write flexible and safe code by focusing on object shapes.
Practice
Solution
Step 1: Understand Type Compatibility
TypeScript checks if the properties and their types in one class instance match those expected by another class type.Step 2: Check Class Names and Methods
Class names or method counts do not affect compatibility; only the shape (properties and types) matters.Final Answer:
When their instances have matching properties and types -> Option CQuick Check:
Compatibility = matching properties and types [OK]
- Assuming class names must match
- Thinking method count matters
- Believing file location affects compatibility
B to a variable typed as class A in TypeScript, assuming compatibility?Solution
Step 1: Review TypeScript Assignment Syntax
To assign an instance of class B to a variable typed as A, uselet a: A = new B();if B is compatible with A.Step 2: Identify Incorrect Syntax
Other options misuse constructor calls or type annotations and are invalid.Final Answer:
let a: A = new B(); -> Option BQuick Check:
Uselet var: Type = new Class();[OK]
- Calling classes like functions
- Swapping variable and type names
- Using incorrect constructor syntax
class A { x: number; }
class B { x: number; y: string; }
let a: A = new B();
console.log(a.x);What will be the output when this code runs?Solution
Step 1: Analyze Class Properties and Assignment
Class B has properties x and y. Class A has only x. Assigning new B() to a variable typed as A is allowed because B has at least the properties of A.Step 2: Check Output of console.log(a.x)
The property x exists on the B instance. Since no value is assigned to x, it is undefined, so console.log(a.x) outputs "undefined".Final Answer:
undefined -> Option AQuick Check:
Compatible class instance property accessed correctly [OK]
- Expecting runtime error due to extra properties
- Thinking assignment causes compilation error
- Assuming class properties are auto-initialized to 0
class A { x: number; }
class B { y: string; }
let a: A = new B();Solution
Step 1: Check Property Compatibility
Class A requires property x. Class B only has property y, so B instances lack x.Step 2: Understand TypeScript Compatibility Rules
TypeScript requires the assigned instance to have all properties of the target type. Missing x causes error.Final Answer:
Because B does not have property x required by A -> Option DQuick Check:
Missing required property causes error [OK]
- Thinking class names must match
- Assuming extra properties cause error
- Believing constructor call is invalid
class Person { name: string; age: number; }
class Employee { name: string; age: number; salary: number; }Which assignment is valid and why?let p: Person = new Employee();let e: Employee = new Person();Solution
Step 1: Compare Properties of Person and Employee
Employee has all properties of Person plus salary. Person lacks salary.Step 2: Check Assignment Compatibility
Assigning Employee instance to Person variable is valid (extra properties allowed). Assigning Person instance to Employee variable is invalid (missing salary).Final Answer:
Onlylet p: Person = new Employee();is valid because Employee has all Person properties -> Option AQuick Check:
Extra properties allowed, missing properties not [OK]
- Assuming both assignments are valid
- Confusing extra vs missing properties
- Thinking class names affect compatibility
Ready to prove it?
Pass the test and this pattern moves unknown
