【问题标题】:How to write tests for typescript typing definition?如何为打字稿打字定义编写测试?
【发布时间】:2018-08-24 01:39:38
【问题描述】:

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

但是我怎样才能测试类型定义呢?

【问题讨论】:

    标签: typescript typescript-typings


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我为此编写了一个库,请查看: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,例如映射类型。

      【讨论】:

        【解决方案3】:

        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 正是我发现这个问题时所寻找的!
        猜你喜欢
        • 2017-03-17
        • 1970-01-01
        • 1970-01-01
        • 2017-04-23
        • 1970-01-01
        • 2018-06-26
        • 2022-01-11
        • 1970-01-01
        • 2018-06-05
        相关资源
        最近更新 更多