Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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
Visual studio code 如何在vscode中使用jsdoc正确获取包装函数中返回值的推断类型?_Visual Studio Code_Types_Jsdoc - Fatal编程技术网

Visual studio code 如何在vscode中使用jsdoc正确获取包装函数中返回值的推断类型?

Visual studio code 如何在vscode中使用jsdoc正确获取包装函数中返回值的推断类型?,visual-studio-code,types,jsdoc,Visual Studio Code,Types,Jsdoc,以下是一些代码(简化),以便更好地理解: 发送请求的包装器 它在发送请求和完成请求时执行一些常见的操作 它返回请求的结果(处理程序) 异步函数请求(处理程序){ //普通的东西 试一试{ 常量结果=等待处理程序() 返回结果| | true } 捕捉(错误){ doSomethingWithError(错误) 返回错误 } 最后{ //普通的东西 } } /** *设想一个简单的服务/api客户机 */ 常量someApiClient={ /** *@returns{Promise}3个首字

以下是一些代码(简化),以便更好地理解:

发送请求的包装器
  • 它在发送请求和完成请求时执行一些常见的操作
  • 它返回请求的结果(处理程序)
异步函数请求(处理程序){ //普通的东西 试一试{ 常量结果=等待处理程序() 返回结果| | true } 捕捉(错误){ doSomethingWithError(错误) 返回错误 } 最后{ //普通的东西 } } /** *设想一个简单的服务/api客户机 */ 常量someApiClient={ /** *@returns{Promise}3个首字母 */ 异步getSomeData(){ 返回['a','b','c'] } } /** *只是一个使用api客户机的函数或方法,它声明了类型 */ 异步函数fetchMeSomeDataHandler(){ 返回someApiClient.getSomeData() } const result=等待请求(()=>fetchMeSomeDataHandler()) 预期 在这里,我希望vscode/jsdoc推断“result”的类型是string[],甚至可以从api客户机中给出描述(“3个第一个字母”)

但事实并非如此,它将在最后给出一种类型的
any

我们在vscode中得到了什么 如果我们按照vscode拾取的类型进行操作,我们可以看到它正在“一点一点地丢失类型”,直到什么都没有了

  • 为api客户端拾取完整类型描述
  • 处理程序定义中已知该类型,但我们丢失了客户机值描述(3个首字母)
  • 对于最终结果,我们完全丢失了类型信息

  • VS代码确实尝试根据函数参数的使用情况推断函数参数的类型。一个简单的例子是:

    函数foo(a){ 返回a.b; } foo({b:3}) 这导致
    foo
    具有签名
    函数foo(a:any):any
    。您的代码是这个限制的一个更复杂的例子

    修复方法是在
    请求上显式注释参数类型

    /**
    *@T模板
    *@param{()=>Promise}处理程序
    *@return{Promise}
    */
    异步函数请求(处理程序){
    ...
    }
    
    在这种特定情况下,我们还需要显式的
    @返回值
    ,因为catch块不返回类型为
    T
    的值(它返回
    any
    ,因为错误是非类型化的)

    如果写入了
    请求
    ,则可以省略
    @返回

    /**
    *@T模板
    *@param{()=>Promise}处理程序
    */
    异步函数请求(处理程序){
    //普通的东西
    常量结果=等待处理程序()
    返回结果
    }
    
    因为VS代码可以推断函数的返回类型(但请记住,显式类型在许多情况下非常有用,特别是对于可能返回多个不同类型的函数)

    添加显式键入后,
    result
    应具有正确的类型:


    看起来不错!但是这里的关键点是
    @template T
    注释。我在jsdoc文档中没有看到它。它似乎是一个
    typescript
    相关标签?我可以在这里找到它:看到了吗