Допустим имеем такой код
class BaseLol { /* ... */ }
class Lol extends BaseLol {
constructor(public name: string) {
super();
this.name = name.toUpperCase();
}
}
Надо что бы можно его использовать таким образом, и что бы были подсказки по параметрам:
import lol from './lol';
const instance = lol('qwe');
Экспортировать его можно таким образом например
export default (name: string) => new Lol(name);
Или так
export default (...args: ConstructorParameters<typeof Lol>) => new Lol(...args);
Вопрос в том можно ли сделать какой то хелпер что бы не прокладывать параметры каждый раз, хотелось бы что то типа такого:
function exportLol(classFromExport) {
return (...args) => new classFromExport(...args);
}
export default exportLol(Lol);
но тогда нету подсказок по параметрам.
Плюс этот базовый класс может использоваться на проекте без тайпскрипта, что бы были хоть минимальные подсказки, можно переписать первую конструкцию таким образом:
class BaseLol {
constructor() {
return new Proxy(this, {
get(target, prop) {
if (prop === "init") {
return (...args: any) => {
const clone = Object.assign(
Object.create(Object.getPrototypeOf(target)),
target
);
clone.init(...args);
return clone;
};
}
},
});
}
/* ... */
}
class Lol extends BaseLol {
init(name: string) {
this.name = name.toUpperCase();
return this;
}
}
И экспортировать потом таким образом:
export default new Lol().init;
Тогда можно использовать таким образом:
import lol from './lol';
const instance = lol('qwe');
И видны подсказки по параметрам.
Суть в том, чтобы было удобно писать классы без лишнего бойлерплейта, и использовать их внешне как функцию без оператора new.
Хз как лучше...