使用泛型一致定义回调的 JSDoc 语法是什么?

发布于 2025-01-10 03:02:23 字数 1206 浏览 3 评论 0原文

我有以下身份函数的 JSDoc 定义:

/**
 * @template T
 * @callback id
 * @param {T} x
 * @returns {T}
 */

当我将它与普通函数定义一起使用时,它按预期工作,没有抱怨:

import { writable, derived } from 'svelte/store'

/**
 * @template T
 * @type {id<T>}
 */
function identity (x) {
  return x
}
const number = identity(writable(42))
identity(derived(number, $number => $number * 2))

它正确地推断 number 是一个 Writable(来自 Svelte 定义),因此 $number 是一个 number

然而,当在另一个函数中定义该函数时,从 identity 返回的类型会丢失:

/**
 * @template T
 * @param {(identity: id<T>) => unknown} definition
 */
function Model (definition) {
  /**
   * @template T
   * @type {id<T>}
   */
  function identity (x) {
    return x
  }
  return definition(identity)
}

Model(function (identity) {
  const number = identity(writable(42))
  identity(derived(number, $number => $number * 2))
})

在这种情况下,numberany,因此 $numberunknown,因此它会抱怨:“算术运算的左侧必须是 'any'、'number'、'bigint' 类型或枚举类型”。

两者为何有差异?以及如何调整它以确保它推断出正确的类型?

谢谢!

I have the following JSDoc definition of an identity function:

/**
 * @template T
 * @callback id
 * @param {T} x
 * @returns {T}
 */

When I use it with a plain function definition, it works as expected, no complaints:

import { writable, derived } from 'svelte/store'

/**
 * @template T
 * @type {id<T>}
 */
function identity (x) {
  return x
}
const number = identity(writable(42))
identity(derived(number, $number => $number * 2))

It correctly infers that number is a Writable<number> (from the Svelte definitions), and therefore $number is a number.

However when defining that function inside another one, the types returned from identity are lost:

/**
 * @template T
 * @param {(identity: id<T>) => unknown} definition
 */
function Model (definition) {
  /**
   * @template T
   * @type {id<T>}
   */
  function identity (x) {
    return x
  }
  return definition(identity)
}

Model(function (identity) {
  const number = identity(writable(42))
  identity(derived(number, $number => $number * 2))
})

In this case number is any, and therefore $number is unknown, and so it complains: "The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type."

Why is there a difference between the two? and how can it be tweaked to ensure that it infers the correct types?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文