【发布时间】:2018-08-24 01:39:38
【问题描述】:
我们有一个 Node.js 库,最近我们为它添加了一个类型定义。
但是我怎样才能测试类型定义呢?
【问题讨论】:
标签: typescript typescript-typings
我们有一个 Node.js 库,最近我们为它添加了一个类型定义。
但是我怎样才能测试类型定义呢?
【问题讨论】:
标签: typescript typescript-typings
DefinitelyTyped 中的测试是应该正确进行类型检查的文件。因此,测试会练习 API 的不同部分,并通过编译器运行(但生成的 JavaScript 代码并未实际执行)。例如,请参阅@types/express 的测试。
对于您自己的项目,我想您会自己编写一个类似的测试文件,并将其作为构建的一部分进行编译(如果编译成功,则测试成功)。当然,如果您已经有使用这些类型定义的现有 TypeScript 代码,那可能就足够了。
Typings-checker 是一个概念验证,它也允许测试失败(输入错误的代码不应编译)。
【讨论】:
我为此编写了一个库,请查看:https://github.com/qurhub/qur-typetest
typescript 编译器仅检查类型是否正确,但它无法检查您的类型是否在您预期失败时失败。
因此,在提到的库中,您可以这样编写测试:
const str: string = "foo"
为了确保类型 string 在分配给值 "foo" 时能够编译。然后你写这样的测试:
// tt:throws:Type '1' is not assignable to type 'string'.
const str: string = 1
为了确保类型 string 在分配给值 1 时无法编译。
当然,您应该测试实际的复杂类型,而不是 string,例如映射类型。
【讨论】:
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));
从 Typescript 3.9 开始,您也可以使用内置的 // @ts-expect-error 注释:
当一行以 // @ts-expect-error 注释为前缀时,TypeScript 将禁止报告该错误;但是如果没有错误,TypeScript 会报告 // @ts-expect-error 是不必要的。 (source)
【讨论】:
// @ts-expect-error 正是我发现这个问题时所寻找的!