- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的 TypeScript + React + Webpack + Jest + Enzyme 可以正常工作。
我觉得有必要在我的测试规范中提供一些可访问的全局函数。我可以通过指向 setupTestFrameworkScriptFile
来做到这一点Jest 配置中的选项到 .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 的情况并非如此。没有导出全局 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>;
最佳答案
如果我们想声明 global.mountWithContext
函数存在并且具有指示的类型,我们可以将以下内容添加到项目中的空声明文件中。
import React from 'react';
import enzyme from 'enzyme';
declare global {
namespace NodeJS {
interface Global {
mountWithContext<P, S>(node: React.ReactElement<any>): enzyme.ReactWrapper<P, S>;
}
}
}
详情
下面是对上面每个结构的分解:
declare global
block :这个构造的目的是修改,如果你愿意的话,通过引入新的声明或修改现有的声明来扩充全局范围,从 < strong>在 非全局上下文中,例如模块。我们的声明文件是一个模块,因为它包含一个从 Enzyme 导入 ReactWrapper
的顶级 import
子句。这样的 block 称为“全局增强”,也可能出现在实现文件中。
包裹在 namespace NodeJS
结构中的 interface Global
:在我们的测试中,我们正在访问 mountWithContext
函数作为由 Node 环境提供的全局变量,顺便命名为 global
。此变量已由 Node 的类型声明声明在与其他环境全局变量(例如 process
)相同的级别。但是,我们需要通过添加新成员来扩充其类型。此全局 global
的 type 是 interface
Global
已在 namespace
内声明NodeJS
,由 Node 的官方声明。我们通过声明 interface
Global
的新成员来实现这一点。我们的增强需要包装在包含 Global
的 namespace
中,否则它将被视为一个单独的 interface
。粗略地说,词法范围适用。 (回想一下,TypeScript 接口(interface)可以在同一范围内多次声明,并且这些声明将被合并)
注意事项
我们在哪里放置这个声明?任何会导致 TypeScript 获取它并将其包含在我们的编译上下文中的地方。按照惯例,我们将把它放在项目根目录中名为 globals.d.ts 的文件中。 (从技术上讲,它可以命名为其他名称并进入较低目录)。
重要的是要注意这个声明文件是我们应用程序代码的一部分,应该 checkin 源代码管理。它必须不放在目录中的第三方声明旁边,例如typings、node_modules/@types 或 < strong>jspm_packages/npm/@types.
同样重要的是要注意,此扩充仅影响 TypeScript 文件(.ts
、.tsx
、.d.ts
)。如果我们宁愿声明此函数由 TypeScript 语言服务获取,只是为了在 .js
或 .jsx,
文件中工作时提供智能感知,这种方法将不起作用.
关于reactjs - 如何将其他类型导入我的 TypeScript 自定义声明文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41896655/
我在覆盖 ReSwift Pod 中的函数时遇到问题。我有以下模拟类(class): import Foundation import Quick import Nimble import RxSwi
我有一个类似于下面的继承结构。我正在采用 Printable 协议(protocol)并努力覆盖 description 属性。我遇到了一个谷歌此时似乎不知道的奇怪错误,提示为第三类,并引用了第二类和
我有一个类“Cat”和 Cat 类的一个子类“DerivedCat”。 Cat 有一个函数 meow(),而 DerivedCat 覆盖了这个函数。 在应用程序中,我声明了一个 Cat 对象: Cat
Kotlin 变量 变量是用于存储数据值的容器。 要创建一个变量,使用 var 或 val,然后使用等号(=)给它赋值: 语法 var 变量名 = 值 val 变量名 = 值 示例 va
C 中的所有标识符在使用前都需要声明,但我找不到它在 C99 标准中表示的位置。 我觉得也是指宏定义,不过定义的只是宏展开顺序。 最佳答案 C99:TC3 6.5.1 §2,脚注 79 明确指出: T
今天我的博客提要显示错误: This page contains the following errors: error on line 2 at column 6: XML declaration
在编写 IIF 语句、表和下面给出的语句时出现错误。 陈述: SELECT IIF(EMP_ID=1,'True','False') from Employee; table : CREATE TAB
我正在创建一个登录 Activity ,我希望它在按下登录按钮时显示进度对话框,我声明、初始化并调用了它,但它没有显示。但是当我在创建时调用进度对话框时,它出现了 这是我的代码: public cla
当我输入声明语句时: Vector distance_vector = new Vector(); 我收到错误(在两种情况下都在“双”下划线): Syntax error on token "doub
我正在本地部署在docker-for-desktop中。这样我将来可以迁移到kubernetes集群。 但是我面临一个问题。使用永久卷时,docker容器/ pod中的目录将被覆盖。 我正在拉最新的S
我有一个 MyObject 类型的对象 obj,我声明了它的实例。 MyObject obj; 但是,我没有初始化它。 MyObject 的类看起来像: public class MyObject {
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
这个问题已经有答案了: Android: Issue during Arraylist declaration (1 个回答) 已关闭 9 年前。 有时我会看到 ArrayList 声明如下 Arra
我对java比较陌生,经过大量搜索,我无法将相关问题的任何解决方案与我的解决方案配对。我正在尝试实现一种非常简单的方法来写入/读取数组,但编译器无法识别它。 “键盘”也是一个“无法识别的变量”。这是数
简短:何时分配内存 - 在声明或初始化时? 长整型:int x;将占用与int z = 10;相同的内存。 此外,这对于包含更多数据的自定义对象将如何工作。假设我有这个对象: public class
我需要使用此程序更好地理解函数定义、声明和正确调用。我真的需要了解如何使用它们。您能否向我展示编写此程序的正确方法(所有三个都正确并进行解释)? #include #include quad_eq
这是我的主要功能以及我要传递的内容。 int main(void){ struct can elC[7]; // Create an array of stucts Initiali
我想知道是否有更好的方法来完成此任务; 我有一个对象 - 其中一个属性是字典。我有一组逗号分隔值。我需要过滤 Dictionary 并仅获取 Dictionary 值至少与其中一个值匹配的那些元素 这
下面的using-declarations有什么意义 using eoPop::size; using eoPop::operator[]; using eoPop::back; using eoPo
我的问题更像是一个关于 for 循环样式的好奇问题。在阅读别人的一些旧代码时,我遇到了一种我以前从未见过的风格。 var declaredEarlier = Array for(var i=0, le
我是一名优秀的程序员,十分优秀!