【问题标题】:Restricting TypeScript generic using another generic in JSDoc使用 JSDoc 中的另一个泛型限制 TypeScript 泛型
【发布时间】:2021-08-01 17:22:38
【问题描述】:

我想知道是否可以使用 JSDoc cmets 从第二个泛型类型中引用第一个泛型类型,例如utility-types 包将Optional<T, K> 定义为:

type Optional<T extends object, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;

我尝试在 JSDoc cmets 中重新创建这种类型:

/**
 * @template {object} T
 * @template {keyof T} K
 *
 * @typedef {Omit<T, K> & Partial<Pick<T, K>>} Optional
 */

此代码不起作用,TypeScript 在第二个 @template 处输出 TS2304: Cannot find name 'T'.。为了使这种类型正常工作,K 必须 受到限制,因为 Pick&lt;T, K&gt; 要求 Kkeyof T

我的 TypeScript 版本是 4.3.5

【问题讨论】:

    标签: typescript generics jsdoc


    【解决方案1】:

    我想出了一个临时的解决方法,虽然不太一样,但确实有效:

    /**
     * @template {object} T
     * @template K
     *
     * @typedef {K extends keyof T ? Omit<T, K> & Partial<Pick<T, K>> : never} Optional
     */
    

    仍然欢迎有关原始问题的答案。

    【讨论】:

      【解决方案2】:

      考虑下一个示例:

      /**
       * @template T
       * @template {keyof T} K
       * @typedef {Omit<T, K> & Partial<Pick<T, K>>} Optional SpecialType - creates a new type named 'SpecialType'
       */
      
      /**
       * @template T
       * @template {keyof T} K 
       * @param {T} obj
       * @param {K} key
       * @return {Optional<T,K>}
       */
      function optional(obj, key) {
          return x;
      }
      
      const result = optional({ age: 42 },'age')
      

      【讨论】:

      • 问题是这个解决方案引入了一个实际的函数而不仅仅是一个类型,这是多余的并且可能不正确(x是什么?)
      • 那么就去掉这个功能?我已经定义了可选类型。有什么问题?
      • 那么您的无约束类型定义在使用 JSDoc cmets 或作为 TypeScript 类型定义时都会引发错误:typescriptlang.org/play?#code/…
      • 这就是我之前尝试过的(见问题),现在 TypeScript 似乎还看不到Tcheck this image
      猜你喜欢
      • 2020-11-05
      • 2018-07-23
      • 2019-06-27
      • 2018-12-22
      • 2021-06-01
      • 2021-06-09
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      相关资源
      最近更新 更多