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