如何在jsdoc(打字稿)中声明嵌套泛型类的类型?

时间:2020-06-20 20:15:40

标签: typescript generics jsdoc

我正在用JS编写一个应用程序,我还想通过添加JsDoc注释使其可被TypeScript编译。


背景信息(以了解我的问题)


代码的结构被包装在IIFE中的模块/名称空间中,从而可以导出其外部功能/成员,而不能导出其内部。看起来像这样:

/** @namespace mod1 */
const mod1 = (function() {
    class Private {}
    class Public {}
    return { Public }
})()

此方法运行良好,但有一点不便。要访问另一个名称空间中的类型,我必须这样做:

/** @type mod1["Public"]["prototype"] */
let foo = new mod1.Public()

而不是这个,它会引发错误ts(2694): Namespace 'hl' has no exported member 'A'.

/** @type mod1.Public */ // or `mod1.Public.prototype`, same error
let foo = new mod1.Public()

该错误是有道理的(在jsdoc中使用[]表示访问对象的属性),但这仍然很奇怪/不便。
注意:这不是我现在要问的问题,不是,但也非常感谢您在这里提供帮助!


我的问题

我在一个名称空间中声明了一个通用类,如下所示:

/** @namespace mod1 */
const mod1 = (function() {
    /** @template T */
    class Foo {
        /** @param {{ foo?: string, bar?: T }} */
        constructor({ foo = '', bar = undefined }) {}
    }
    return { Foo }
})()

问题在于,结合["prop"]问题,我无法在该命名空间之外声明泛型类型!
我已经按照以下方式尝试了多种方法,但是我没有任何一种方法可以工作:

/** @type mod1["Public"]["prototype"]<string> */
let foo = new mod1.Foo({ foo: 123 })

/** @type (mod1["Public"]["prototype"])<string> */
let foo = new mod1.Foo({ foo: 123 })

...

注意:如果传递了该参数,TypeScript可以自动推断类的类型,但是如果可能的话,我想以一种显式的方式来定义类型,例如函数参数或时间参数未通过。

如果需要,我可以附加完整的示例文件,然后可以对其进行类型检查。

here in the TypeScript playground也提供了该演示,以使其易于测试。它在TypeScript中,但是问题应该相同。

感谢您的帮助!

0 个答案:

没有答案
相关问题