【问题标题】:Using a type as a value in typescript在打字稿中使用类型作为值
【发布时间】:2017-06-09 13:04:33
【问题描述】:

我正在使用 inject-loader 来模拟正在单元测试的 Typescript 项目的依赖项。我正在测试的服务有这样的导入行:

import pnp, { SearchQuery, Sort, SortDirection, CamlQuery } from "sp-pnp-js";

对于我的测试,我想模拟 pnp 上的几个函数,但保持类不变。在我的单元测试文件中,我包含了这个导入:

import { SearchQuery, Sort, SortDirection, CamlQuery } from "sp-pnp-js";

这使我的测试可以访问必要的类。我已经声明了一个模拟服务对象:

// mock services
const mockPnp = {
    default: { ... }
};

我正在连接到我的目标类实例:

Service = require("inject!./sharepointservice")({
    "sp-pnp-js": mockPnp
}).Service;

只要我不运行任何引用这些类的代码(即SearchQuery),一切正常。为了让它发挥作用,我尝试将它添加到模拟中:

// mock services
const mockPnp = {
    default: { ... },
    SearchQuery: SearchQuery
};

但是,我收到 'SearchQuery' only refers to a type, but is being used as a value here 错误。

我尝试转换为any(同样的错误),使用模块和导出的技巧,但没有运气。我应该能够使用 Typescript 编写任何 Javascript,而这在 Javascript 中会很简单——我在这里缺少什么?

【问题讨论】:

  • 根据definition fileSearchQuery是一个接口,这意味着你不能把它当作一个值(如错误消息所说)。 Typescript 接口没有被编译到 js 输出中,你不能在运行时使用它们。
  • 我什至没有想过检查它是否是一个接口 - 只是假设它是一个类型。让我找到我需要的其中一个类型,然后重试...
  • ...和真正的类型(如搜索),工作得很好。
  • @NitzanTomer - 将其发布为答案,以便我将其标记为已接受:)

标签: unit-testing typescript


【解决方案1】:

根据definition fileSearchQuery是一个接口,这意味着你不能把它当作一个值(如错误消息所说)。

Typescript 接口没有被编译到 js 输出中,你不能在运行时使用它们。

【讨论】:

  • 这看起来可以正常工作 - 接口在编译时应用,所以我不需要在模拟中伪造它们,而且在模拟中提供真实类也没有错误。
【解决方案2】:

从技术上讲,因为它只是为了类型安全,我可以这样做 t: MyInterface = {};

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 1970-01-01
    • 2020-12-09
    • 2018-10-04
    • 1970-01-01
    • 2021-05-21
    • 2020-01-17
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多