Skip to main content

The Shape of Types

A Learning TypeScript > Classes 🍲 entree project.

Hark! Listen! The eternal deathly scrapings of a thousand locked doors rattling from unseen forces. Back. Forth. Back. Forth.

An unspeakable horror consumes all. It is here, and it is hungry.

To understand this ancient evil, we must implement it using TypeScript classes. Only then shall we have the clarity to send our sorcerers into battle against it.


If you haven't yet, set up the repository locally.

git clone learning-typescript-projects
cd learning-typescript-projects
npm i

Change your terminal directory to this project's:

cd projects/classes/the-shape-of-types

In one terminal, start the TypeScript compiler in watch mode:

tsc --watch

In another terminal, run Jest via the test script. For example, to run tests in watch mode:

npm test -- --watch


The first class you must export from the file must be named Horror. It will contain...

  • Property:
    • name: An abstract read-only string only visible to the class and its derived classes
  • Public Methods:
    • doBattle: Takes in an opponent Horror, and if this horror's .getPower() is greater than the opponent's, consumes the opponent (read more later).
    • getPower: Returns the sum of calling this.getPowerFrom on each previously consumed opponent (read more later), plus the number of previously consumed opponents
  • Protected Abstract methods:
    • getPowerFrom: Takes in a previously consumed opponent and returns a computed power number
    • isEvil: Returns a boolean

Each previously consumed horror passed to getPowerFrom should contain the following properties:

  • evil: Whether the horror was evil
  • name: The name of the consumed horror
  • power: The consumed horror's previous power level

Two more exported classes must be exported that each extends Horror:

  • Demon, with:
    • Property:
      • name: "Demon"
    • Methods:
      • getPowerFrom: If the previously consumed horror was evil, returns half its power; otherwise, returns double its power
      • isEvil: Returns true
  • Sorcerer, with:
    • Constructor: takes in a name to set as the property, and an evil boolean
    • Methods:
      • getPowerFrom: If the previously consumed horror's evil matches this sorcerer's evil, returns double its power; otherwise, returns exactly its power
      • isEvil: Returns the evil boolean received in the constructor


  • You may add # private members to the classes as you wish, such as to store previously consumed opponents.