Awesome
mini-typescript
This is a fork from Nathan Shively-Sanders's mini-typescript.
The purpose of this repo is to practice the exercises and learn more about compilers and TypeScript.
To get set up
# Get set up
npm i
npm run build
# Or have your changes instantly happen
npm run build --watch
# Run the compiler:
npm run mtsc ./tests/singleVar.ts
Limitations
- This is an example of the way that Typescript's compiler does things. A compiler textbook will help you learn compilers. This project will help you learn Typescript's code.
- This is only a tiny slice of the language, also unlike a textbook. Often I only put it one instance of a thing, like nodes that introduce a scope, to keep the code size small.
- There is no laziness, caching or node reuse, so the checker and transformer code do not teach you those aspects of the design.
- There's no surrounding infrastructure, like a language service or a program builder. This is just a model of tsc.
Exercises
- Add EmptyStatement (https://github.com/imteekay/mini-typescript-fork/pull/2).
- Make semicolon a statement ender, not statement separator (https://github.com/imteekay/mini-typescript-fork/pull/7).
- Hint: You'll need a predicate to peek at the next token and decide if it's the start of an element.
- Bonus: Switch from semicolon to newline as statement ender.
- Add string literals (https://github.com/imteekay/mini-typescript-fork/pull/4).
- Refactor: rename
Literal
toNumericLiteral
(https://github.com/imteekay/mini-typescript-fork/pull/6). - Add support for the lexer to report errors (https://github.com/imteekay/mini-typescript-fork/pull/12)
- report unterminated string literal error
- Add let (https://github.com/imteekay/mini-typescript-fork/pull/8).
- Make sure the binder resolves variables declared with
var
andlet
the same way. The simplest way is to add akind
property toSymbol
. - Add use-before-declaration errors in the checker.
- Finally, add an ES2015 -> ES5 transform that transforms
let
tovar
.
- Make sure the binder resolves variables declared with
- Allow var statements to declare multiple symbols (https://github.com/imteekay/mini-typescript-fork/pull/9).
- Allow var to have multiple declarations. (https://github.com/imteekay/mini-typescript/pull/2)
- You'll need to convert a Symbol's declaration into a list.
- Check that all declarations have the same type.
- Add objects and object types.
- Implement mapped types
- Implement optional member
- Implement method signature
- Add
interface
.- Make sure the binder resolves types declared with
type
andinterface
the same way. - After the basics are working, allow interface to have multiple declarations.
- Interfaces should have an object type, but that object type should combine the properties from every declaration.
- Make sure the binder resolves types declared with
- Implement union types
- Add an ES5 transformer that converts
let
->var
. - Add function declarations and function calls.
- Add arrow functions with an appropriate transform in ES5.