使用 JSDOC for javascript,如何使对象中的单个方法具有模板参数

With JSDOC for javascript, how to make a single method in an object have a template parameter

提问人:Austin Haws 提问时间:11/11/2023 更新时间:11/11/2023 访问量:15

问:

在 Javascript 中,使用 JSDoc,如何记录@typedef中的单个方法具有泛型/模板化参数?

---- typedef.d.js ----
/**
 * @typedef MyService {
 *  @property {() => string[]} otherFunc
 *  @template ArrayT
 *  @property {(a: ArrayT[]) => ArrayT[]} shuffleArray
 * }
 */

在上面的 typedef 中,不起作用。它显示了所需的效果,即单个 shuffleArray 方法的类型是泛型的,但 MyService 的其余部分不是。换句话说,shuffleArray 应该能够采用任何数组类型,而不必为该类型实例化新的 MyService 对象。@template ArrayT

---- MyService.js ----
/** @typedef {import('my-app').MyService} MyService */

export const MyService = /** @extends {MyService} */ (
  class {
    /** @returns {string[]}
    otherFunc() {
      return ['I', 'am', 'not', 'generic'];
    }

    /**
     * @template ArrayT
     * @param {ArrayT[]} a
     * @returns {ArrayT[]}
     */
    shuffleArray(a) {
      return shuffle(a);
    }
  }
);

上述方法确实有效,但其键入不会中继到应用的其余部分,因为应用的其余部分使用 typedef.d.js 中的 MyService typedef。@template ArrayT

---- someOtherFile.js ----
import MyService from './MyService.js';
const myService = new MyService();
const a1 = myService.shuffleArray([1, 2, 3, 4]);
const a2 = myService.shuffleArray(['1', '2', '3', '4']);

希望使用相同的实例化服务来普遍接受不同类型的数组,而不必使整个 MyService 成为通用的,也不必使用 .any

JavaScript 泛型 类型 jsdoc

评论


答: 暂无答案