Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.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
Javascript 如何在typescript中描述简单Just函子的接口?_Javascript_Typescript_Visual Studio Code_Jestjs_Typescript Typings - Fatal编程技术网

Javascript 如何在typescript中描述简单Just函子的接口?

Javascript 如何在typescript中描述简单Just函子的接口?,javascript,typescript,visual-studio-code,jestjs,typescript-typings,Javascript,Typescript,Visual Studio Code,Jestjs,Typescript Typings,我第一次尝试用typescript编写一个简单的界面,但对几乎所有的事情都有疑问 问题很简单。如何描述这个简单的jest matcher扩展 /** *@param{*}v任意值 */ 功能正义(五){ 返回{ fmap:f=>刚好(f(v)) } } 期待({ /**将两个函子中的两个值与Object.is进行比较 *@方法 *@augments.Matchers *@param{*}实际是要测试的函子。 *@param{*}应为您所期望的函子。 */ functorToBe(实际、预期){

我第一次尝试用typescript编写一个简单的界面,但对几乎所有的事情都有疑问

问题很简单。如何描述这个简单的jest matcher扩展

/**
*@param{*}v任意值
*/
功能正义(五){
返回{
fmap:f=>刚好(f(v))
}
}
期待({
/**将两个函子中的两个值与Object.is进行比较
*@方法
*@augments.Matchers
*@param{*}实际是要测试的函子。
*@param{*}应为您所期望的函子。
*/
functorToBe(实际、预期){
常量实际值=getFunctorValue(实际值)
常量expectedValue=getFunctorValue(预期)
const pass=Object.is(实际值、预期值)
返回{
通过,
消息(){
返回${actual}的${actualValue}到${pass?''not'}是${expectedValue}的${expectedValue}`
}
}
}
})
测试(‘等式推理(身份)’,()=>{
expect(just(1)).functorToBe(just(1))
})
我尝试过这一点,但根本不确定泛型类型:

从'jest'导入{Matchers}
接口函子{
(值?:任何):{
fmap:(f:value)=>函子
}
}
接口匹配器{
函子对象(实际:函子,预期:函子):R
}
参考:

匹配器的jest类型定义要点如下:

/**
*每次要测试值时都会使用'expect'函数。
*你很少会单独叫'expect'。
*/
接口期望{
/**
*每次要测试值时都会使用'expect'函数。
*你很少会单独叫'expect'。
*
*@param-actual要应用匹配器的值。
*/
(实际:T):匹配器;
/**
*您可以使用'expect.extend'将自己的匹配器添加到Jest中。
*/
扩展(obj:ExpectExtendMap):无效;
//等等。
}
嗯,这让人困惑。jest repo中唯一的索引是,但这不是我在vscode中得到的索引,它是。

扩展 您对
Matchers
的合并几乎是正确的,但是从明确类型[1]上的jest类型来看,我可以看到
Matchers
嵌套在
jest
命名空间中。Typescript手册中涉及这一点的部分是

jsconfig.json几乎是一样的,但不需要显式添加
“allowJs”:true
。但请注意,添加tsconfig或jsconfig将关闭从“确定类型”自动下载类型,并且您必须手动
npm install@types/jest
(以及您使用的库的任何其他类型)。如果您不想添加tsconfig,我可以在JS文件中手动添加一个引用作为第一行:

/// <reference path="./extensions.ts" />

这就是让我感到困惑的地方。如果您对问题的这一部分有疑问,请告诉我,我会尽力帮助。

functorToBe(实际:Functor,预期:Functor)
我想说
实际
预期
必须是相同的类型。不是您导入的内容,并且仅用于测试,而不用于附带的代码中。如何在参数T中指定类型?我是否只记录
,然后typescript解析器就会发现它?无论如何,混合使用typescript和js似乎需要更多的工作。目前,我无法导入
jest
,因为这不是它的工作方式,将myExtensions.d.ts重命名为myExtensions.js会给我带来很多错误。看起来我应该使用JSDoc,它不能处理这个用例:你已经跟踪了
T
Oops,我完全误解了你的问题。我认为(1)jest使用模块是因为您的import语句,(2)jest提供了自己的类型。我将编辑此答案以修复它。谢谢你的帮助Nathan。我刚才又试了一次,想让打字稿检查器认出我的匹配者,但没有成功。如果您有时间的话,请看一下我的工作:Jest 26.1的当前文档提到了
声明全局{
,但vscode 1.46.1告诉我“全局范围的扩展只能直接嵌套在外部模块或环境模块声明.ts(2669)”中,尽管我不知道这是什么意思。
{
    "compilerOptions": {
        "allowJs": true,
        "checkJs": true,
    },
    "include": [
        "test.js",
        "extensions.ts",
    ]
}
/// <reference path="./extensions.ts" />
functorToBe(expected: R): R;