如何编写打字稿输入定义的测试?

时间:2018-03-15 09:49:32

标签: typescript typescript-typings

我们有一个Node.js lib,最近我们为它添加了一个类型定义。

但我怎么能测试类型定义呢?

3 个答案:

答案 0 :(得分:2)

DefinitelyTyped中的测试是应该正确进行类型检查的文件。因此,测试执行API的不同部分,并且它通过编译器运行(但生成的JavaScript代码实际上并未执行)。例如,请参阅@types/express的测试。

对于您自己的项目,我猜您自己编写一个类似的测试文件,并将其编译为构建的一部分(如果编译,则测试成功)。当然,如果您已经使用这些类型定义的现有TypeScript代码,那么这可能是足够的测试。

Typings-checker是一个概念验证,它也允许测试失败(错误输入的代码不应该编译)。

答案 1 :(得分:2)

我为此目的编写了一个库,请检出:https://github.com/qurhub/qur-typetest

打字稿编译器仅检查类型是否正确,但无法在您期望类型失败时检查您的类型是否失败。

因此,在提到的库中,您可以编写如下测试:

const str: string = "foo"

为了确保类型string在分配给值"foo"时进行编译。然后编写这样的测试:

// tt:throws:Type '1' is not assignable to type 'string'.
const str: string = 1

为确保类型string在分配给值1时无法编译。

当然,您应该测试您的实际复杂类型,例如映射类型,而不是string

答案 2 :(得分:0)

Microsoft的dtslint是用于测试类型声明的便捷工具。顾名思义,它是一种静态分析工具,它不会运行您的测试文件,而只是对其进行类型检查。您还可以使用该工具评估的基于注释的断言来补充测试:

import { f } from "my-lib"; // f is(n: number) => void

// $ExpectType void
f(1);

// Can also write the assertion on the same line.
f(2); // $ExpectType void

// $ExpectError
f("one");

tsd是另一个具有类似断言的工具:

import {expectType} from 'tsd';
import concat from '.';

expectType<string>(concat('foo', 'bar'));
expectType<string>(concat(1, 2));