如何指定继承class的模板类型?

How to specify template type of inherited class?

考虑一个通用集合:

/**
 * A collection of items of the same type
 * @template TSingleItem
 * */
class ItemsCollection {
    /** @type {TSingleItem[]} **/
    get items() {
        return [createSingleItem()];
    }
    /**
     * Creates a new item based on the implementation type
     * @param {string} param
     * @returns {TSingleItem}
     */
    createSingleItem(param) {
        throw new Error("Pure virtual method call!");
    }
}

现在我们将其实现为:

class Item {
    constructor(name) {
        this.name = name;
    }
}

class Items extends ItemsCollection {
    createSingleItem(param) {
        return new Item(param);
    }
}

我如何告诉 JSDoc 假设继承的 class 上的 itemsItem[] 而不是 TSingleItem[]

我在 class 上面试过这个:

/**
 * @extends {ItemsCollection<Item>}
 * */
class Items extends ItemsCollection

至少在 visual studio 中没有帮助。正确的语法是什么?如果它与 Visual Studio intellisense 一起使用可加分。

事实证明这是正确的代码,正如所见 in this nice tutorial:

/**
 * @extends {ItemsCollection<Item>}
 * */
class Items extends ItemsCollection

它在 Visual Studio 2017 年也有效,只是花了一段时间才流行起来。我要离开这个问答而不是删除,因为它不是很明显或不容易 google 确认。