Решено: Вся эта суета была вызвана тем, что 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, которое виновато, но я действительно пытаюсь здесь :))