2015-09-25 2 views
23

У меня есть несколько функций утилиты. Каков наилучший способ их упаковки, а затем импортировать?Как структурировать класс утилиты

Это то, что я пытаюсь сделать:

import * as util from './util' 

export class myClass{ 
    constructor() 
    { 
      util.doSomething("test"); 
    } 
} 

Тогда в классе:

export class Util{ 
    doSomething(val: string){ return val;} 

    doSomethingElse(val: string{ return val;} 
} 

сообщение об ошибке я получаю от VS является «Свойство йоЗотеЬЫпд не существует на тип Util. "

ответ

38

Если создать файл, который содержит utils.ts

export default class Utils { 
    static doSomething(val: string) { return val; } 
    static doSomethingElse(val: string) { return val; } 
} 

, то вы можете упростить код клиента, как это:

import Utils from './utils' 

export class MyClass { 
    constructor() 
    { 
     Utils.doSomething("test"); 
    } 
} 
+2

Так я и предпочитаю делать это сейчас. –

+0

Должны ли методы быть статическими? Невозможно создать экземпляр класса Utils? – user728630

+1

@GregGum Обертка ваших функций без гражданства в классе просто для этого - плохая идея, потому что она нарушает методы оптимизации модулей, такие как дребезжание. Вы должны экспортировать все как можно ближе к верхнему уровню модуля. –

18

Там есть пара проблем здесь:

  1. Вы не инстанцировании ничего, а doSomething является методом экземпляра
  2. Когда вы import * as util, util представляет собой модуль, а не объект в нем.

Если вы хотите Util, вы должны просто импортировать, что:

import { Util } from './util' 

Далее, вы должны создать экземпляр Util, прежде чем, наконец, вызывая метод на нем:

var u = new Util(); 
u.doSomething("test"); 

Вот исправлен код до:

import { Util } from './util' 

export class MyClass{ 
    constructor() 
    { 
     var u = new Util(); 
     u.doSomething("test"); 
    } 
} 

Все, что сказано, кажется, что-то странное в том, как вы используете свои утилиты. Это полностью личное мнение, но я бы не вызывал методы, которые «что-то делают», т. Е. Вызывают побочные эффекты, в конструкторе.

Кроме того, методы в Util не выглядят так, как будто они должны быть в этом классе, поскольку класс не содержит состояния, от которого они зависят. Вы всегда можете экспортировать регулярные функции из модуля. Если вы написали свой Utils модуль вроде этого:

export function doSomething(val: string) { return val; } 

export function doSomethingElse(val: string) { return val; } 

вы бы экспортировать свои функции непосредственно и будет обходить стороной инстанциации хлопот, а на самом деле ваш исходный код будет работать правильно, как это.

+0

Спасибо. Да, функция экспорта ... это то, что я пытался сделать. –

+0

Модули Util не должны создаваться экземпляром с ключевым словом 'new'. Если вы хотите следовать стандартным соглашениям и уменьшать создание контекста выполнения, методы класса Util должны быть статическими методами, доступными через 'Util.doSomething()' – Ryan

+0

@Ryan. Вы ошибаетесь. Если функциональность, которую вы экспортируете, зависит от какого-либо состояния, вы должны экспортировать ее в качестве реального класса. Если он не имеет статуса, так как в этом случае *, вы должны экспортировать его как независимый экспорт на высший уровень *. Если вы просто втиснете их в статичный класс, нет никаких причин, по которым вы разбиваете дробление деревьев, чтобы не принести вам пользы. –

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