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

2024-02-13

这是一些代码(简化的)以更好地理解:

发送请求的包装器

  • 当请求发送和完成时,它会执行一些常见的操作。
  • 它返回请求的结果(处理程序)。
async function request (handler) {
  // common stuff
  try {
    const result = await handler()
    return result || true
  }
  catch (err) {
    doSomethingWithError(err)
    return err
  }
  finally {
  // common stuff
  }
}

/**
 * Imagine a simple service / api client
 */
const someApiClient = {
  /**
   * @returns {Promise<string[]>} 3 first letters
   */
  async getSomeData () {
    return ['a', 'b', 'c']
  }
}

/**
 * Just a function or method using the api client, that has types declared
 */
async function fetchMeSomeDataHandler () {
  return someApiClient.getSomeData()
}

const result = await request(() => fetchMeSomeDataHandler())

Expected

在这里,我希望 vscode / jsdoc 推断“结果”的类型是 string[],甚至给我 api 客户端的描述(“3 个第一个字母”)。

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

我们在 vscode 中得到了什么

如果我们跟踪 vscode 获取的类型,我们可以看到它“一点一点地丢失类型”,直到什么都没有剩下。

  1. 为 api 客户端选取的完整类型描述。
  1. 该类型在处理程序定义中是已知的,但我们丢失了客户端值描述(前 3 个字母)。
  1. 我们完全丢失了最终结果的类型信息

VS Code 确实尝试根据函数参数的用法来推断函数参数的类型。一个简单的例子是:

function foo(a) {
    return a.b;
}

foo({ b: 3 })

这导致foo有签名function foo(a: any): any。您的代码是此限制的更复杂的示例。

修复方法是显式注释参数类型request:

/**
 * @template T
 * @param {() => Promise<T>} handler 
 * @return {Promise<T>}
 */
async function request(handler) {
   ...
}

在这种具体情况下,我们还需要明确的@returns因为 catch 块不返回 type 的值T(它返回一个any因为错误是未键入的)。

您可以省略@returns if request被写:

/**
 * @template T
 * @param {() => Promise<T>} handler 
 */
async function request(handler) {
    // common stuff
    const result = await handler()
    return result
}

因为 VS Code 可以推断函数的返回类型(但请记住,显式类型在许多情况下很有用,特别是对于可能返回多种不同类型的函数)

添加显式类型后,result应该有正确的类型:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 vscode 中使用 jsdoc 正确获取包装函数中返回值的推断类型? 的相关文章

  • 包含脱机 HTML 的 Visual Studio Code 扩展

    VSCode 扩展是否可以包含在安装扩展时写入磁盘某处 无论在哪里 的 HTML 以便我可以从链接打开该 HTML 例如 我想要在其工具提示中提供指向某个函数的离线文档的链接 是的 您的扩展可以使用标准节点 api 来下载文件 然后你可以
  • Haskell 中的异构多态性(正确方法)

    让一个模块来抽象Area操作 错误的定义 class Area someShapeType where area someShapeType gt Float module utilities sumAreas Area someShape
  • matplotlib - 模块“sip”没有属性“setapi”

    我刚刚设置了带有所有 Python 扩展的 VS Code 通过 Anaconda Python 版本为 3 8 3 解释器是 venv 当我运行这段代码时 import matplotlib pyplot as plt 错误显示 Exce
  • 警告:“沙箱”不在已知选项列表中,但仍传递给 Electron/Chromium

    我在用Linux Mint 20 and vscode 1 52 1 My xsession errors文件显示Warning sandbox is not in the list of known options but still p
  • 如何在 VS Code 中集成 babun shell

    我尝试过更改设置 terminal integrated shell windows to babun mintty地点 但是 babun shell 窗口单独打开 并且不与 VS code 集成 有人知道如何实现这一目标吗 经过2个小时的
  • 为什么 Python 布尔值占用超过一个字节?

    显然 Python 中整数占用 24 个字节 我可以理解 它这样做是因为代表无限数字的额外花哨 然而 布尔数据类型看起来也花费了高达 24 个字节 尽管它只能表示两个可能值之一 为什么 除了 1 位表示之外 还可能需要存储哪些额外数据Tru
  • 有没有办法让vscode行号字段宽度变小?

    包含代码行号 VSC 的垂直列太宽 有办法缩小范围吗 您无法更改此列的大小 实际上有三列 行号左侧是名为的列glyphMargin 设置调试断点的地方 红点 编辑设置时 当您指向该线上时 该列会显示一支笔 如下面的屏幕截图所示 行号本身 在
  • 如何处理错误的数据类型输入

    在C 中 如何处理错误的输入 例如 如果程序要求输入一个整数 那么当您键入一个字符时 它应该能够执行某些操作 然后循环重复输入 但是当您在需要整数时输入一个字符时 循环会无限循环 反之亦然 程序进入死循环的原因是std cin由于输入失败而
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • 在 VS Code 中找不到 Git

    由于某种原因 我在 Windows 10 笔记本电脑上运行的 VS Code 中找不到 Git 在我的 Mac 上 当你一直向下滚动时 用户默认设置 中会出现一个 Git 但在我的 Windows 10 笔记本电脑上 它根本不存在 源代码管
  • 如何清除整个终端(PowerShell)

    我有一个问题 在powershell中使用clear或cls命令仅清除终端的可见部分 我想知道如何清除整个终端 顺便说一句 我使用 VSCode tl dr 问题是关于清零的both屏幕和回滚缓冲区 in the 综合终端 of 视觉工作室
  • 在 .vscode 中调试时遇到问题

    我最近在 VSCODE 中调试时遇到了一个大问题 我尝试通过搜索网站并重新安装一些扩展来自行修复它 而不是在中显示我的结果调试控制台它将以下输出写入我的terminal cd Users AVFL Documents Programming
  • ESLint 如何集成到 Create React App 中?

    当我跑步时npx create react app some name 为我创建了一个简单的 React 项目 当我随后窥视package json 似乎有一些 ESLint 存在的证据 因为有 eslintConfig extends r
  • 在 Visual Studio Code 中调试 Strapi

    我正在尝试在 VS Code 中调试我的 Strapi 项目 3 0 0 beta 16 6 我的启动 json type node request attach name Attach to strapi port 9229 我的pack
  • VS Code Pylint 在缺失的函数/类文档字符串上用蓝色下划线突出显示整个函数

    这种情况突然开始发生 当出现缺少函数文档字符串警告时 python pylint 会用蓝色波浪线突出显示整个函数 我怎样才能让它只突出显示函数定义或在定义行上制作一个小指示器 在开发时突出显示整个文件是非常烦人的 这是缺少类文档字符串的示例
  • 什么是欣德利米尔纳?

    我遇到过这个词欣德利 米尔纳 我不确定是否理解它的意思 我已阅读以下帖子 史蒂夫 叶格 动态语言的反击 http steve yegge blogspot com 2008 05 dynamic languages strike back
  • 获取参数类型的参数

    假设我定义了一个这样的类型 type Point Tx Ty end 然后我创建一个这种类型的变量 例如 a Point Int64 something 现在 我只知道我可以获得以下类型a by typeof a 那是 Point Int6
  • 如何从 Visual Studio Code API 打开浏览器

    我只是在探索一种从用于开发扩展的 Visual Studio Code API 打开默认浏览器的方法 以下是我的代码 var disposable vscode commands registerCommand extension brow
  • Scala:如何将可变参数指定为类型?

    代替 def foo configuration String String 我希望能够写 type Configuration String String def foo configuration Configuration 主要用例是
  • 有没有办法在 VSCode 中保存时运行 go 测试,并将其输出到终端?

    现在我有几个项目在VSCode中运行 运行起来相当繁琐go test每次我编写新代码时 我宁愿立即看看我是否破坏了某些东西 我知道在 Javascript 中我可以在每次保存文件时运行测试 并将输出发送到终端 现在我正在使用 保存时运行 h

随机推荐