2015-09-25 10 views
23

私はいくつかのユーティリティ関数を持っています。これらをパッケージ化してインポートする最善の方法は何ですか?そして、クラスのユーティリティクラスを構成する方法

import * as util from './util' 

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

::私はVSから取得

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

    doSomethingElse(val: string{ return val;} 
} 

エラーメッセージはプロパティのdoSomethingがタイプutilの上に存在しない」である

は、これは私がやろうとしていますものです。 "

答えて

38

あなたは

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

を含むファイルutils.tsを作成するなら、あなたはこのようなあなたのクライアントコードを簡素化することができます。

import Utils from './utils' 

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

これは今私がそれをやることを好む方法です。 –

+0

メソッドは静的でなければなりませんか? Utilsクラスのインスタンスを使用することはできませんか? – user728630

+1

@GregGumあなたのステートレスな関数をちょうどクラスのラップに入れておくのは悪い考えです。なぜなら、それは木のようなモジュール最適化テクニックを壊すからです。モジュールの最上位にできるだけ近いものをすべてエクスポートする必要があります。 –

18

夫婦の問題がここにあります:

  1. あなたは何をインスタンス化していない、とあなたがimport * as utilを行うとdoSomethingがインスタンスメソッド
  2. で、utilはモジュールではなく、その中のオブジェクトを表します。あなたがUtilをしたい場合

、あなたはちょうどそれをインポートする必要があります:あなたのコードは、パッチを適用しています。ここ

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

import { Util } from './util' 

次に、あなたは最終的にそれにメソッドを呼び出す前に、Utilをインスタンス化しますup:

import { Util } from './util' 

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

言ったことすべては、あなたがあなたのutilsのを使用している方法について奇妙な何かがあるように思われます。これは完全に個人的な意見ですが、コンストラクタで「何かをする」、つまり副作用を引き起こすメソッドを呼び出すことはありません。クラスは、それが依存という状態を保持していないので、彼らは、そのクラスにする必要がありますように

また、Utilのメソッドは本当に見ていません。モジュールから通常の関数をいつでもエクスポートすることができます。あなたが直接あなたの関数をエクスポートすることだろうとインスタンス化の面倒を回避だろう、とあるとして、実際にあなたの元のコードが正常に動作します

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

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

:あなたは、このようなあなたのutilsのモジュールを書いた場合。

+0

ありがとうございました。はい、「輸出関数...」は私がやろうとしていたものです。 –

+0

Utilモジュールは 'new'キーワードでインスタンスとしてインスタンス化してはいけません。あなたは、標準の規則に従うと、実行コンテキストの作成を減らしたい場合はあなたが間違っている@Ryan、UtilのクラスメソッドはUtil.doSomething() '' – Ryan

+0

を介してアクセス静的メソッド、する必要があります。エクスポートする機能が一部の状態に依存する場合は、インスタンス化可能なクラスとしてエクスポートする必要があります。この場合のようにステートレスの場合は、*トップレベルの独立したエクスポートとしてエクスポートする必要があります*。何も理由がない静的なクラスにそれらを詰め込むだけでは、あなたは自分自身に利益のために木の揺れを壊す。 –

関連する問題