Everything You Need for Type Testing.

TSTyche is a type testing tool for TypeScript. It ships with describe() and test() helpers, expect style assertions and a mighty test runner.

Quick Start Reference

Helpers

If you are used to test JavaScript, a simple type test file should look familiar:

import { expect, test } from "tstyche";
 
function isSameLength<T extends { length: number }>(a: T, b: T) {
  return a.length === b.length;
}
 
test("isSameLength", () => {
  expect(isSameLength([1, 2], [1, 2, 3])).type.toBe<boolean>();
  expect(isSameLength("one", "two")).type.toBe<boolean>();
 
  expect(isSameLength).type.not.toBeCallableWith(1, 2);
});

To organize, debug and plan tests TSTyche has:

  • test(), it() and describe() helpers,
  • with .only, .skip and .todo run mode flags.

Assertions

The assertions can be used to write type tests (like in the above example) or mixed in your unit tests:

import assert from "node:assert";
import test from "node:test";
import * as tstyche from "tstyche";
 
function milliseconds(value: number) {
  if (typeof value === "number" && !Number.isNaN(value)) {
    return value * 1000;
  }
 
  throw new Error("Not a number");
}
 
test("milliseconds", () => {
  const sample = milliseconds(10);
 
  assert.equal(sample, 10_000);
  tstyche.expect(sample).type.toBe<number>();
 
  // Will pass as a type test and not throw at runtime
  tstyche.expect(milliseconds).type.not.toBeCallableWith("20");
});

Here is the list of all matchers:

  • .toBe(), .toBeAssignableTo(), .toBeAssignableWith() compare types or types of expression,
  • .toAcceptProps() checks the type of JSX component props,
  • .toBeApplicable ensures that the decorator function can be applied,
  • .toBeCallableWith() checks whether a function is callable with the given arguments,
  • .toBeConstructableWith() checks whether a class is constructable with the given arguments,
  • .toHaveProperty() looks up keys on an object type,
  • .toRaiseError() captures the message or code of a type error.

Runner

The tstyche command is the heart of TSTyche. For example, it can select test files by path, filter tests by name and pass them through a range of TypeScript versions:

tstyche query-params --only multiple --target '>=5.0 <5.3'

This simple! (And it has watch mode too.)

Last updated on