Skip to main content

Treasure Hunter

A Learning TypeScript > Generics 🍲 entree project.

Good evening, professor. We're with the National Typeological Survey. We've received word that there is a new system of catacombs and tunnels beneath your city. We'd like you to explore them.

Please submit a collectTreasure function to us that can recursively sift through buried contents. We will provide you functions to determine what is fake, real, or general scrap.

Setup

If you haven't yet, set up the github.com/LearningTypeScript/projects repository locally.

shell
git clone https://github.com/LearningTypeScript/projects learning-typescript-projects
cd learning-typescript-projects
npm i
shell
git clone https://github.com/LearningTypeScript/projects learning-typescript-projects
cd learning-typescript-projects
npm i

Open your editor in this project's directory:

shell
code projects/generics/treasure-hunter
shell
code projects/generics/treasure-hunter

In one terminal, run the TypeScript compiler via the tsc script. For example, to start the TypeScript compiler in watch mode:

shell
npm run tsc -- --watch
shell
npm run tsc -- --watch

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

shell
npm run test -- --watch
shell
npm run test -- --watch

Specification

Export a collectTreasure function. It should have three type parameters: Content, Fake, and Real. Fake and Real should both extend Content.

The collectTreasure function should have three runtime parameters:

  • buried: A Buried object (see later) of Content data
  • isFake: A type predicate function that takes in a datum and returns whether it is Fake
  • isReal: A type predicate function that takes in a datum and returns whether it is Real

Also create and export a Buried type with a single type parameter. Each Buried object can be one of three things:

  • An array of the same type of Buried objects
  • A NextArea object, which can be either:
    • A Catacomb shape, with properties:
      • inside: A Buried object of the same type
      • type: "catacomb"
    • A TunnelSystem shape, with properties:
      • entrances: An array of Buried objects of the same type
      • type: "tunnels"
  • A Treasure object with properties:
    • content: A datum of the same type
    • type: "treasure"

The collectTreasure function should return an object with three properties:

  • fake: Array of found Fake items
  • real: Array of found Real items
  • scrap: Array of all other items

Notes

Note: your terminal should be in the treasure-hunter directory, not the root repository's directory.

  • Don't use any or leave any implicit anys.