我们有一个Node.js lib,最近我们为它添加了一个类型定义。
但我怎么能测试类型定义呢?
答案 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));