2016-06-29 5 views
0

В узле.js имеется известный подход, чтобы использовать шаблон фабричного модуля. Для, например:Заводской шаблон заводского шаблона

m.js

app.js

var o = require('./m')(module); 
// using o 

Как я могу сделать то же самое в машинописи. На самом деле, создание m.ts не проблема:

m.ts

function factoryMethod(module: NodeModule): any { 
    // doing some stuff 
} 

export = factoryMethod; 

Но как я должен использовать синтаксис импорта, чтобы использовать этот модуль фабричный метод, как в JavaScript?

ответ

1

Я не уверен, что я получил этот общий шаблон. Вы передаете объект 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.

Надеюсь, это даст вам несколько идей.

+0

Благодарю вас за ответ. Использование модуля в качестве параметра было как пример. Общая идея заключалась в том, чтобы иметь какой-то заводской шаблон, не обязательно использовать модуль. Хорошо, спасибо, спасибо. –

+0

@AndreiTarutin ОК, я думал, что есть какой-то странный образец, о котором я совершенно не знал. Я рад, что смогу помочь. – McMath

1
import {factoryMethod} from './m.ts' 


let module = factpryMethod('module'); 
+0

На самом деле, я хотел сделать это как в javascript, импортировать и инициализировать в одной строке. –

Смежные вопросы