Я не уверен, что я получил этот общий шаблон. Вы передаете объект module
из одного модуля в другой? Все виды других объектов передаются примерно так (например, app
, db
), но мне не нравится идея обхода объекта module
. У меня возникнет соблазн назвать это анти-шаблоном. Разумеется, объект module
должен оставаться в модуле, к которому он принадлежит.
Сказали, что если вы просто хотите импортировать и вызывать функцию в той же строке, вы можете использовать , используя функцию Node require()
, как и обычный JavaScript. Допустим, вы передаете экспресс app
, а не module
.
const o = require('./m')(app);
Однако вы теряете безопасность типа с этим; o
будет иметь тип any
. Вам нужно будет явно определить тип o
.
const o: Module = require('./m')(app);
Это немного глупо. Фактически, Module
, скорее всего, будет определен в модуле, который вам нужен в любом случае, поэтому он, вероятно, также побеждает себя. Мое предложение таково. Не ожидайте использовать те же шаблоны, к которым вы привыкли, в простом JS в TypeScript, который имеет свои собственные шаблоны.
Одна вещь, которую вы можете сделать, - это импортировать функцию вверху, а затем вызвать ее позже. TypeScript использует ES2015-style modules, которые не позволяют вам импортировать функцию и вызывать ее в той же строке. Вам придется переписать оба файла, так как export =
недействителен в ES2015.
// m.ts
interface Module {
// properties, methods, etc.
}
export function factoryMethod(app: Express.Application): Module {
let module = {};
// Initialize module methods, properties, etc.
return module;
}
Интерфейс позволяет вывод типа в app.ts
, который является улучшение вида.
// app.ts
import {factoryMethod} from './m';
// ...
let o = factoryMethod(app);
Но это по-прежнему очень глупо. Нам не нужно определять интерфейс и всю эту глупость. Вместо этого мы можем использовать класс . Классы очень часто являются ответами в TypeScript, и вы обнаружите, что большинство шаблонов в TypeScript связаны с ними.
// m.ts
export class Module {
constructor(private app: Express.Application) { }
cache: string[];
someMethod(): Promise<Express.Response> {
// do something with this.app
}
}
А потом в app.ts
import {Module} from './m';
// ...
let o = new Module(app);
Теперь мы не должны беспокоиться об интерфейсах и тому подобное. Сам класс является типом. Это немного отличается от того, что вы, вероятно, увидите в типичном приложении Node, но это тот тип шаблона, который вы все время находите в TypeScript.
Надеюсь, это даст вам несколько идей.
Благодарю вас за ответ. Использование модуля в качестве параметра было как пример. Общая идея заключалась в том, чтобы иметь какой-то заводской шаблон, не обязательно использовать модуль. Хорошо, спасибо, спасибо. –
@AndreiTarutin ОК, я думал, что есть какой-то странный образец, о котором я совершенно не знал. Я рад, что смогу помочь. – McMath