【问题标题】:JSDoc assign generic type to a valueJSDoc 将泛型类型分配给一个值
【发布时间】:2021-10-22 15:42:00
【问题描述】:

我有一个项目,我使用 JSDoc 来注释类型和 typescript 定义文件以更舒适地创建这些类型。 我将一些通用类型从 JSDoc 移植到 typescript,因为它更容易编写。 我发现我不能将泛型类型直接分配给变量,因为它说我必须提供类型参数。所以,如果我尝试这样做:

/*
 * @type {import('./api').WithDb}
 */
const withDb = handler => async args => {

它失败了,因为 WithDb 需要两个参数,但这正是我想要的,说这是一个通用函数。 JSDoc 允许您使用@template 语法定义泛型类型,因此我可以像这样重新注释函数:

 /*
 * @template T
 * @template K
 * @type {import('./api').WithDb<T,K>}
 */
const withDb = handler => async args => {

 /*
 * @template T,K
 * @type {import('./api').WithDb<T,K>}
 */
const withDb = handler => async args => {

但这是我想避免的很多样板。除了@type 以外的类型绑定还有其他方法吗?

【问题讨论】:

  • 这能回答你的问题吗? TypeScript how to create a generic type alias for a generic function? 您应该将WithDb 定义为泛型函数,而不是泛型类型(export type WithDb = &lt;T, K&gt;(params) =&gt; ReturnType 而不是export type WithDb&lt;T, K&gt; = (params) =&gt; ReturnType
  • 这在 JSDoc 方面工作得很好,所以在这方面,这太棒了。但是,我不能再将该类型用作任何定义文件的泛型,因为它不再是泛型。

标签: typescript jsdoc


【解决方案1】:

恐怕你无法使用@type。但是您可以在某种程度上通过扫过地毯下的样板来清理它:

  1. 您可以在文件顶部附近的某个位置定义一个 @typedef,这将是一个别名:
/**
* @template T,K
* @typedef {import('./api').WithDb<T,K>} WithDb
*/
  1. 然后你的实现可以使用你新的别名类型:
/** @type {WithDb} */
const withDb = handler => async args => {

有点笨拙,尤其是因为您可能在类型文件中包含WithDb。但是如果您在很多地方都使用该类型,那么这将为您节省一些字符。 JSDoc 涵盖了广泛的用例,但总是非常冗长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    • 2019-06-11
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    相关资源
    最近更新 更多