2016-06-17 24 views
1

静的ユーティリティ関数の束でクラスを設定しました。注入されたクラスに静的関数 "does not exist"があります

// utils.ts 
class Utils { 
    public static blank(anything) { 
     if (_.isNil(anything) || anything === "") { 
      return true; 
     } 
     return false; 
    }; 

    // ... 
} 

window.Utils = Utils; 

私は定数として私の角アプリにこれを注入:

angular.module("myApp", []).constant("Utils", window.Utils); 

その後、私は私のコントローラやプロバイダでそれを使用することができます。

class MyCtrl { 
    constructor(private $scope, private Utils: Utils, private MyService: MyService) { } 

    // ... 
} 

angular.module("myApp").controller("MyCtrl", MyCtrl); 

しかし、私は、コンパイル時にこのエラーが表示されます:

javascripts/admin/controllers/my_ctrl.ts(6,29): error TS2339: 
Property 'blank' does not exist on type 'Utils'. 

このような定数を角度コントローラに注入するときに、静的メソッドの正しい型情報を取得するにはどうすればよいですか?

+0

'民間Utilsのを行う必要があります。なぜインスタンスメソッドの代わりに静的メソッドを使用するのですか?そしてUtilを定数ではなくサービスとして定義してみませんか? –

+0

lodashのようなライブラリは、インスタンス化する必要はありませんが、同じ方法で動作するはずです。私はそれをプロバイダーで使用できるように定数として定義しています。私はサービスでそれをすることができませんでした。コンパイラにクラスのインスタンスではなくインジェクションする方法を教えてもらえますか? – Shaun

答えて

0

注入された正しいタイプのprivate Utilsは、Utilsではありません。これは、クラスUtilsのインスタンス化されたインスタンスを意味します。

正しいタイプprivate Utilsクラス自体(またはむしろ、クラスUtilsのと同じタイプのもの)なく、クラスのインスタンスであることを活字体に伝えている、typeof Utilsです。

タイプ Utilsまたはパラメータ Utilsに別の名前を使用する必要があります。 TypeScripts typeofに渡された単項式は、そのスコープにパラメータを含むため、:Utils:typeof Utilsに変更するだけで循環参照に関するエラーが発生します。それはないですが、Utilsのは**クラスのUtilsの**インスタンスであるので、あなたが言っている活字体:Utils`:このような

何かトリックに

constructor(private $scope, private Utils: typeof window.Utils, private MyService: MyService){ } 
+0

'typeof window.Utils'を試しましたが、何のエラーもありませんでした。しかし、「Utils」の静的関数として存在しない関数を使ってみると、エラーにはなりませんでした。私の 'Utils'クラスで' public static notReal(){} 'が定義されていない限り、私は' this.Utils.notReal() 'を実行しようとするとエラーになるでしょうか? – Shaun

+0

@Shaun Hmm、weird。コンパイラは何らかの理由で 'window.Utils'の完全な型情報を持っていないと思っています。それは' any'か何かだと思っています... 'private utils:typeof Utils'のようにプロパティの名前を変更することもできます。元の例では、 'this.Utils'はインスタンスメソッドに対して「正しく」動作しましたか?つまり、this.Utils.notReal()はエラーを出し、 'this.Utils.realInstanceMehtod()'は機能しましたか? – noppa

+0

型なしでそのまま残すと、 'any'とみなされ、渡すメソッドにエラーが発生しません。私はオブジェクトをインスタンス化せずにそれを使用していて、それはアプリケーションで正しく動作しますが、私はタイピング支援やチェックを取得しません。しかし、それはAngularの依存性注入設計を使ってアプローチするのは間違った方法かもしれません。 – Shaun

関連する問題