【发布时间】:2017-06-13 07:02:28
【问题描述】:
我的 TypeScript + React + Webpack + Jest + Enzyme 可以正常工作。
我觉得有必要在我的测试规范中提供一些可访问的全局函数。我可以通过将 Jest 配置中的 setupTestFrameworkScriptFile 选项指向 .js 文件来做到这一点,我有这样的东西:
const Enzyme = require("enzyme");
const React = require("react");
const getMuiTheme = require("material-ui/styles/getMuiTheme").default;
global.mountWithContext = (node) => {
return Enzyme.mount(node, {
context: {
muiTheme: getMuiTheme()
},
childContextTypes: {
muiTheme: React.PropTypes.object
}
});
};
在我的规范文件中,我可以调用mountWithContext(),它会在我运行测试时正常工作。但我的编辑器无法识别该功能。
为了解决这个问题,我创建了一个 /typings/declarations.d.ts 文件:
declare function mountWithContext(node: any): any;
现在我的规范文件可以识别mountWithContext 函数,但类型是“错误的”。正确的定义应该是这样的:
declare function mountWithContext(node: React.ReactElement<any>): Enzyme.ReactWrapper<P, S>;
React.ReactElement 被正确识别,因为@types/react/index.d.ts 文件包含以下内容:
export = React;
export as namespace React;
酶的情况并非如此。没有导出全局Enzyme。看着@types/enzyme/index.d.ts 有这样的东西:
export interface ReactWrapper<P, S> extends CommonWrapper<P, S> {
(...)
}
但即使我这样做:
declare function mountWithContext(node: React.ReactElement<any>): ReactWrapper<P, S>;
它不起作用。 ReactWrapper 仍然无法识别。
我尝试在此 declarations.d.ts 文件中导入,这将允许我正确使用类型,但我的函数声明将停止在我的规范文件中被识别。我还尝试添加这样的三斜杠指令:
/// <reference path="../node_modules/@types/enzyme/index.d.ts" />
文件已被识别,但ReactWrapper 类型仍未识别。
那么...我怎样才能为我的自定义 mountWithContext 全局函数创建一个 TypeScript 函数声明,其中包含所有正确的类型,如下所示:
declare function mountWithContext(node: React.ReactElement<any>): ReactWrapper<P, S>;
【问题讨论】:
-
您是否试图让 TypeScript 获取声明以在
.js文件中使用或在.ts文件中使用? -
@AluanHaddad 仅限
.ts文件。 -
您可以添加您的
tsconfig.json文件吗?可能存在一些类型配置问题。另外,为了完整起见,您是否可以尝试在全局文件中声明像cat() : ReactWrapper这样的函数,以确认唯一的问题是声明而不是其他问题。
标签: reactjs typescript jestjs typescript-typings enzyme