我正在用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中,但是问题应该相同。
感谢您的帮助!