Back to Python
2026-01-265 min read

TS Aliases & Interfaces (Python Programming)

Learn TS Aliases & Interfaces (Python Programming) step by step with clear examples and exercises.

Why This Matters

Welcome to this full guide on TypeScript aliases and interfaces in Python programming! This lesson aims to provide you with a deep understanding of these concepts, helping you write cleaner, more efficient, and easier-to-maintain code.

TypeScript aliases and interfaces are essential tools for large-scale projects where maintaining consistency across different modules or libraries can become challenging. They help enforce type checking, making your code more robust and less prone to errors. They are particularly useful when working with third-party libraries or collaborating with other developers.

Prerequisites

Before diving into TypeScript aliases and interfaces in Python, you should have a basic understanding of the following:

  1. Python programming fundamentals (variables, functions, loops, etc.)
  2. Familiarity with object-oriented programming concepts (classes, inheritance, etc.)
  3. Understanding of static types in TypeScript
  4. Knowledge of Python's typing module for type hinting
  5. Comfortable working with abstract classes and multiple inheritance
  6. Basic understanding of interfaces and aliases in TypeScript (if you are coming from a TypeScript background)

Core Concept

Type Aliases

Type aliases allow you to give a new name to an existing type. This can be particularly useful when working with complex or frequently used types. In Python, we don't have native support for type aliases like in TypeScript, but we can achieve similar results using the typing module.

from typing import TypeAlias

MyStringType: TypeAlias = str
MyListType: TypeAlias = list[str] # Python 3.7+ syntax for type hinting lists
MyDictType: TypeAlias = dict[str, str] # Python 3.7+ syntax for type hinting dictionaries

In the example above, we've defined three type aliases: MyStringType, MyListType, and MyDictType. Now, we can use these aliases instead of their original types for better readability.

my_string: MyStringType = "Hello, World!"
my_list: MyListType = ["one", "two", "three"]
my_dict: MyDictType = {"key1": "value1", "key2": "value2"}

Interfaces

Interfaces in TypeScript are a way to define a contract that a class must implement. In Python, we can achieve similar functionality using abstract classes and multiple inheritance.

from abc import ABC, abstractmethod

class IMyInterface(ABC):
@abstractmethod
def my_method(self) -> None:
pass

class MyClass(IMyInterface):
def my_method(self) -> None:
print("Implementing the interface method.")

In the example above, we've defined an interface IMyInterface and a class MyClass that implements this interface. The my_method() in MyClass must be implemented to satisfy the contract defined by the interface.

Interface Inheritance

You can create a hierarchy of interfaces by having one interface inherit from another, just like classes. This allows you to reuse and extend contracts across multiple classes.

class IBase(ABC):
@abstractmethod
def base_method(self) -> None:
pass

class IDerived(IBase, ABC):
@abstractmethod
def derived_method(self) -> None:
pass

class MyClass(IDerived):
def base_method(self) -> None:
print("Implementing the base method.")

def derived_method(self) -> None:
print("Implementing the derived method.")

In this example, IDerived inherits from both IBase and ABC, allowing us to define a contract that includes methods from both interfaces.

Worked Example

Let's create a simple example where we define a Shape interface and a Circle class that implements this interface:

from abc import ABC, abstractmethod
from typing import TypeAlias

MyFloatType: TypeAlias = float

class IShape(ABC):
@abstractmethod
def get_area(self) -> MyFloatType:
pass

@abstractmethod
def get_perimeter(self) -> MyFloatType:
pass

class Circle(IShape):
def __init__(self, radius: MyFloatType):
self.radius = radius

def get_area(self) -> MyFloatType:
return 3.14 * (self.radius ** 2)

def get_perimeter(self) -> MyFloatType:
return 2 * 3.14 * self.radius

circle = Circle(5)
print("Area:", circle.get_area())
print("Perimeter:", circle.get_perimeter())

In this example, we've defined a Shape interface with methods get_area() and get_perimeter(). The Circle class implements the IShape interface by providing implementations for both methods.

Common Mistakes

  1. Forgetting to implement an abstract method in a class that claims to implement an interface.
  2. Misusing type aliases for simple variable renaming instead of defining complex types.
  3. Not properly defining interfaces, leading to inconsistent or poorly-structured code.
  4. Assuming Python's type hinting is equivalent to TypeScript's static typing, which it is not (Python's type hinting is dynamic).
  5. Failing to understand the difference between abstract classes and regular classes, leading to incorrect usage of interfaces.
  6. Not utilizing multiple inheritance when defining complex hierarchies of interfaces.
  7. Ignoring the benefits of type aliases and only relying on built-in types, resulting in less readable code.

Practice Questions

  1. Define a Vehicle interface with properties brand, model, and year. Create a class Car that implements this interface, adding methods accelerate() and brake().
  2. Create an Animal interface with properties name, species, and age, and a method make_sound(). Implement this interface for the classes Dog and Cat.
  3. Define a Person interface with methods get_name(), get_age(), and introduce_myself(). Create a class Employee that implements this interface, adding properties salary and position.
  4. (Advanced) Design a hierarchy of interfaces for a banking system, including AccountHolder, SavingsAccount, CheckingAccount, and CreditCard. Each interface should define relevant methods and properties, and classes should implement the appropriate interfaces.

FAQ

Q: Can I use type aliases for built-in Python types like int or str?

A: Yes, but it's generally not recommended as it can lead to confusion and unnecessary complexity in your code.

Q: How do I check if a class implements an interface in Python?

A: In Python, there is no direct way to check if a class implements an interface. However, you can use type hints and documentation to ensure proper implementation.

Q: Can I use multiple interfaces for a single class in Python?

A: Yes, you can implement multiple interfaces for a single class by providing separate method implementations for each interface.

Q: Is there a way to enforce type checking at runtime in Python like TypeScript does?

A: Not natively, but tools like mypy and pyright can be used to statically type-check your Python code.

Q: What is the difference between type hinting and type checking?

A: Type hinting is a way of documenting the expected types for variables and function arguments in Python, while type checking is the process of verifying that these types are adhered to at runtime or compile-time.

Q: Can I use interfaces with classes that don't have methods?

A: Yes, you can define interfaces for classes with properties only if needed. However, it's more common to see interfaces defined for classes with methods.

Q: How do I handle situations where a class implements multiple interfaces but one of the required methods is not applicable?

A: In such cases, you can use Python's pass statement to define an empty method that satisfies the contract of the interface. However, it's important to document this in your code and consider whether the class should implement the interface in the first place.

TS Aliases & Interfaces (Python Programming) | Python | XQA Learn