Run your TypeScript type tests using Jest.
Note: the jest-runner-tsd
is using tsd-lite
instead of tsd
. Both of them have the same type testing logic, but tsd-light
makes it easier to test projects written in TypeScript (or types generated by your library).
Most important differences (for the full list see tsd-lite
repo):
tsd-lite
has no additional rules or checks;jest.config
is used to discover test files;- and
tsconfig.json
provides configuration for TS compiler. For details see Configuration section.
yarn add -D jest-runner-tsd @tsd/typescript
Remember to install @tsd/typescript
package. It is a required peer dependency.
First of all, you should configure Jest to discover your test files. For example, if the files are suffix with .test.ts
and live inside __typetests__
directory, set up jest.config.tsd.js
like this:
module.exports = {
displayName: {
color: 'blue',
name: 'types',
},
runner: 'jest-runner-tsd',
testMatch: ['**/__typetests__/*.test.ts'],
};
Your test files will be compiled using the TypeScript compiler (similarly to tsc
), but, instead of emitting JS code, tsd-lite
will analyze types and diagnostics returned by the compiler.
To compile each test file, tsd-lite
will read the nearest tsconfig.json
and will pass the configuration to the compiler. Hence, you may have a configuration for the whole project, or a group of test files, or just a particular test file.
For example, if your project already includes a tsconfig.json
in the root directory, but you prefer to have different configuration for testing, simply add another tsconfig.json
to a directory with the test files. It may override or extend your root configuration.
Hint: run yarn tsc -p path/to/__typetests__ --showConfig
to print the configuration which applies to the test files.
Note: if tsconfig.json
is not found, the compiler will fall back to the default configuration.
Just like TypeScript, tsd-lite
is optionally strict. In contrary, the vanilla tsd
is strict by default. If you are migrating your test suite, remember to set "strict": true
in tsconfig.json
.
import { expectType } from 'tsd-lite';
declare const loggedInUsername: string;
const users = [
{ name: 'Oby', age: 12 },
{ name: 'Heera', age: 32 },
];
const loggedInUser = users.find(u => u.name === loggedInUsername);
expectType<number>(loggedInUser.age);
The assertion in this example fails with "strict": true
, but passes with "strict": false
.
If all is set, simply run yarn jest -c jest.config.tsd.js
command. Or better include a script in package.json
:
"scripts": {
"test:types": "jest -c jest.config.tsd.js"
}
To learn more about tsd
and its assertions see the documentation.
MIT © Jest Community