Merging classes with interfaces in Typescript - Time & Space Complexity
We want to understand how the time it takes to run code changes when we merge classes with interfaces in TypeScript.
Specifically, how does adding interface merging affect the work the program does?
Analyze the time complexity of the following code snippet.
interface User {
name: string;
}
class User {
age: number;
name: string;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
const user = new User('Alice', 30);
console.log(user.name, user.age);
This code merges an interface and a class named User. The class constructor sets properties, and we create one user instance.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Creating an instance of the class
Userand assigning properties. - How many times: Once in this example, but could be many times if creating many users.
When creating more user instances, the work grows linearly with the number of users.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 property assignments |
| 100 | 100 property assignments |
| 1000 | 1000 property assignments |
Pattern observation: Each new user adds a fixed amount of work, so total work grows evenly with the number of users.
Time Complexity: O(n)
This means the time to create users grows directly with how many users you make.
[X] Wrong: "Merging an interface with a class makes the program slower in a way that grows faster than the number of instances."
[OK] Correct: The merge happens at compile time and does not add extra loops or repeated work at runtime. The time depends mainly on how many instances you create, not on the merge itself.
Understanding how TypeScript merges interfaces and classes helps you explain how type information affects runtime behavior, showing you know both design and performance.
"What if the class constructor called a method that loops over a large array? How would the time complexity change?"
Practice
What happens when you declare an interface with the same name as a class in TypeScript?
For example:class Car { drive() {} }
interface Car { color: string; }
Solution
Step 1: Understand interface and class merging
In TypeScript, if an interface has the same name as a class, their types merge. This means the class type now includes members from both.Step 2: Apply to example
The interface adds a 'color' property to the class type, so instances of Car are expected to have 'drive()' and 'color'.Final Answer:
The interface merges with the class, adding the 'color' property to the class type. -> Option BQuick Check:
Same name interface + class = merged type [OK]
- Thinking interface replaces class
- Expecting a syntax error
- Assuming class ignores interface
Which of the following is the correct syntax to merge an interface with a class named Person in TypeScript?
Solution
Step 1: Recall interface declaration syntax
Interfaces are declared with the keyword 'interface' followed by the name and curly braces containing members.Step 2: Check each option
interface Person { age: number; } uses correct syntax: 'interface Person { age: number; }'. Options A, C, and D use invalid syntax like parentheses, brackets, or equals sign.Final Answer:
interface Person { age: number; } -> Option AQuick Check:
Correct interface syntax = interface Person { age: number; } [OK]
- Using parentheses after interface name
- Using brackets instead of braces
- Assigning interface with equals sign
Given the following code, what is the output?
class Animal {
speak() { return "Roar"; }
}
interface Animal {
age: number;
}
const a: Animal = { age: 5, speak() { return "Roar"; } };
console.log(a.age, a.speak());Solution
Step 1: Understand merging and object literal
The interface adds 'age' to Animal type. The object 'a' has both 'age' and 'speak' method matching Animal type.Step 2: Check console.log output
Logging 'a.age' prints 5, and 'a.speak()' returns "Roar". So output is '5 Roar'.Final Answer:
5 Roar -> Option DQuick Check:
Object has both properties, prints values [OK]
- Expecting undefined for age
- Confusing method call with property
- Thinking runtime error occurs
Identify the error in this code that merges a class and interface named Book:
class Book {
title: string;
constructor(title: string) {
this.title = title;
}
}
interface Book {
author: string;
}
const b = new Book("1984");
console.log(b.author);Solution
Step 1: Check merging requirements
The interface adds 'author' property to Book type, but the class does not implement it or assign it.Step 2: Analyze runtime behavior
Creating 'b' with new Book("1984") sets 'title' but 'author' is undefined. Accessing 'b.author' prints undefined, which may cause issues if expected to exist.Final Answer:
Property 'author' is missing in class implementation causing runtime error. -> Option CQuick Check:
Interface adds property, class must implement it [OK]
- Thinking names must differ
- Ignoring missing property implementation
- Assuming no error occurs
You want to extend a class Employee by merging an interface with the same name to add a new method getSalary(). How should you correctly implement this so that getSalary() is usable on Employee instances?
class Employee {
name: string;
constructor(name: string) {
this.name = name;
}
}
interface Employee {
getSalary(): number;
}
// What is the correct way to implement getSalary?Solution
Step 1: Understand interface merging with class
Merging adds type info but does not add implementation. The class must implement the method or it will cause errors.Step 2: Implement method correctly
Since the class does not have getSalary(), adding it to Employee.prototype after declaration provides the implementation and satisfies the interface.Final Answer:
Add getSalary() method to Employee.prototype after class declaration. -> Option AQuick Check:
Interface adds type; method must be implemented in class or prototype [OK]
- Adding method only in interface without implementation
- Trying to add method outside prototype
- Assuming interface adds implementation automatically
Ready to prove it?
Pass the test and this pattern moves unknown
