Как объявить тип вложенного класса generi c в jsdo c (машинописный текст)? - PullRequest
0 голосов
/ 20 июня 2020

Я пишу приложение на 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, но проблема должна быть такой же.

Спасибо за вашу помощь!

...