VSCode, TypeScript и JSDo c: классы внутри (javascript) пространства имен - PullRequest
0 голосов
/ 15 марта 2020

Решено: Вся эта суета была вызвана тем, что VSCode не поддерживает IntelliSense для динамически добавляемых свойств. Я переключился обратно на WebStorm / PhpStorm, и теперь все хорошо!


Я пытаюсь эволюционировать в JS и go из пространств имен (литералы объекта ключ / значение) в классы (один шаг хотя в то же время: я еще не использую ES-модули, так как все еще не могу обернуть голову вокруг упаковочной части, используя Gulp, и некоторые другие вещи, такие как TypeScript, не находящий имена классов и т. д. c.).

У меня было много JS классов, и мой JSDo c выполнялся отлично.

Но теперь я хотел бы иметь единое пространство имен глобальной области, скажем MyProject, иметь мои типы внутри (или, возможно, нет, используя какой-то трюк JSDo c, который будет поддерживаться VSCode), а также мои экземпляры классов.

Пожалуйста, найдите ниже сжатый пример.

Очевидно, мой код будет разделен на несколько файлов.

Также очевидно (по крайней мере для меня): я бы использовал преимущества IIFE для имитации c частных методов (да, я знаю, что вы можете сделать это с модулями, но все еще есть вопрос глотка concat, который я ч Читайте о том, как я должен использовать Babel или что-то еще, плюс другую вышеупомянутую ошибку с TS внутри VSCode).

// Inside my very first file (for example)
const MyProject = {
    MyTypes: {}
};


// Inside a second file
MyProject.MyTypes.TypeManager = (() => {
    // Unless I'm mistaken this is the only way to have private methods in JS classes
    // (along with the non-exporting-from-module thing)
    const _somePrivateMethod = () => {};

    return class {
        constructor() {
            _somePrivateMethod();
        }

        somePublicMethod() {
            console.log('somePublicMethod');
        }
    }
})();


// Inside another file...
(() => {
    // "class MyProject.MyTypes.TypeOther {}" is not grammatically correct

    MyProject.MyTypes.TypeOther = class {
        constructor() {
        }

        someOtherPublicMethod() {
            console.log('someOtherPublicMethod');
        }
    }
})();


// Inside a fourth file...
MyProject.MyTypes.TypeApp = (() => {
    /**
     * @type {MyProject.MyTypes.TypeManager}
     */
    const __manager = new MyProject.MyTypes.TypeManager;

    const __other = new MyProject.MyTypes.TypeOther;

    return class {
        constructor() {
            // Complains that "Property 'somePublicMethod' does not exist on type 'typeof (Anonymous class)'.ts(2339)"
            __manager.somePublicMethod()

            // No intellisense here either (but no error though)
            __other.someOtherPublicMethod()
        }
    }
})();

/** @type {MyProject.MyTypes.TypeApp} */
MyProject.app = new MyProject.MyTypes.TypeApp

Конечно, код работает без сбоев внутри браузера, но у меня нет IntelliSense внутри VSCode и без автоматов c JSDo c.

Это работает, если я использую имена классов snake_case вместо классов с пространством имен, конечно, но я бы не хотел этого делать, потому что я этого не делаю найти это довольно.

Как вы, ребята, получаете как JSDo c для генерации do c, так и VSCode для работы IntelliSense с этими классами пространства имен?

Я буквально просматривал весь Inte rnet в течение нескольких часов, но я начинаю испытывать недостаток воображения для поиска ключевых слов.

Спасибо, любезно!

Best,

EDIT: на самом деле он не работает даже при использовании имен классов snake_case: у меня все еще нет IntelliSense, и у меня также возникают ошибки, если я объявляю эти классы с использованием IIFE, например, так:

const MyProject_MyTypes_MyClassName = (() => {
    return class {
    };
})();

// Gives me: "Property 'prototype' is missing in type '(Anonymous class)' but required in type 'typeof (Anonymous class)'.ts(2741)"
GlobalAppObject.myNewInstance = new MyProject_MyTypes_MyClassName();

Я работаю только без дополнительной конфиденциальности IIFEs, к сожалению:

class MyProject_MyTypes_MyClassName {
}

// It does obviously work perfectly fine (IntelliSense etc.)
GlobalAppObject.myNewInstance = new MyProject_MyTypes_MyClassName();

Возможно, здесь виноваты IIFEs ... Не могу сказать. (Я считаю, что это мое неправильное понимание из JS, которое виновато, но я действительно пытаюсь здесь :))

...