Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何将类型添加到";这";摩卡测试中的关键词?_Typescript_Types_Mocha.js_This - Fatal编程技术网

Typescript 如何将类型添加到";这";摩卡测试中的关键词?

Typescript 如何将类型添加到";这";摩卡测试中的关键词?,typescript,types,mocha.js,this,Typescript,Types,Mocha.js,This,我正在使用该功能初始化mocha测试中的一些异步数据 在每个之前的最上面的中,我创建了一些具有特定类型的对象,并将它们存储在对象中。在it套件中的子测试文件中,我使用this来避免无数次重复代码,但这样做会丢失打字: it("should do something", async function() { await this.token.approve(account, amount); }); 为了恢复它们(特别是自动完成功能),我必须添加一行额外的代码: const token: E

我正在使用该功能初始化mocha测试中的一些异步数据

在每个之前的最上面的
中,我创建了一些具有特定类型的对象,并将它们存储在对象中。在
it
套件中的子测试文件中,我使用
this
来避免无数次重复代码,但这样做会丢失打字:

it("should do something", async function() {
  await this.token.approve(account, amount);
});
为了恢复它们(特别是自动完成功能),我必须添加一行额外的代码:

const token: Erc20 = this.token;
await token.approve(account, amount);
我知道我可以通过用括号强制转换来实现内联,但我不希望这样做


有没有办法定义所有测试套件函数的“this”所有者对象的类型?

您可以扩展Mocha的
上下文接口,并声明其他测试上下文属性

interface MyContext extends Mocha.Context {
  token: Erc20;
}
在测试函数中,您可以为
参数添加类型信息,如下所示:

it('should do something', async function(this: MyContext) {
  await this.token.approve();
});
更新


上面的代码没有在
严格的
模式下编译(
错误TS2769:没有重载与此调用匹配。
)请参阅以获得替代解决方案。

我认为TypeScript中的标准做法是使用词法范围,例如,您可以使用扩展Mocha的
类型。但这将声明所有Mocha测试的属性,而不仅仅是该文件中的测试。此外,正如GitHub用户iknowcss在他的文章中漫无目的地说的那样,这个解决方案还有其他缺点。啊,所谓“词法范围”,我指的是在封闭范围内声明一个变量,并分配给/读取该变量。这也是iknowcss支持的。不幸的是,这不起作用:
没有重载匹配此调用。。。类型“Context”不能分配给类型“MyContext”
。我是否必须在某些mocha配置中指定新的上下文类型?原因似乎是mocha希望传递给
之前的
之前的
it
等的函数具有
上下文类型。它不接受子体类型。我最终接受了这个答案,因为它恰到好处地解决了“this”关键字的问题,而且很奇怪。我创建了一个小的TypeScript文件,它在非严格模式下编译得很好。启用
strict
模式后,我能够重现编译问题。