Я пишу приложение на JS и хочу сделать его компилируемым с помощью TypeScript, добавив комментарии JsDo c.
Справочная информация (чтобы понять мою проблему)
Структура кода разделена на модули / пространства имен, завернутые в 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()
Ошибка имеет смысл ( []
используется в jsdo c для обозначения доступа к свойствам объекта), но это все равно странно / неудобно. Примечание: Это не вопрос, который я задаю сейчас, но помощь и здесь будет очень признательна!
Моя проблема
Я объявил общий c класс внутри одного пространства имен, например:
/** @namespace mod1 */
const mod1 = (function() {
/** @template T */
class Foo {
/** @param {{ foo?: string, bar?: T }} */
constructor({ foo = '', bar = undefined }) {}
}
return { Foo }
})()
Проблема в том, что в сочетании с ["prop"]
, я не могу объявить общий тип c за пределами этого пространства имен! Я пробовал несколько вещей в соответствии со следующими строками, но ни один из них не работал:
/** @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 может автоматически определить тип класса, если этот параметр передан, но если возможно, я хотел бы явный способ определения типа для таких случаев, как аргументы функции или время, когда этот параметр не передается.
При необходимости я могу приложить полный пример
Демоверсия также доступна здесь, на игровой площадке TypeScript , чтобы упростить тестирование. Это в TypeScript, но проблема должна быть такой же.
Спасибо за вашу помощь!