2016-08-11 21 views
2

AngularJS(1.5)プロジェクトでFlowtypeを使用しようとしていますが、$inject annotationについて不平を言います。これを処理する正しい方法は何ですか?

フローバージョン0.30.0

例コード

ナビゲーション/リンク-controller.js

export default class LinksController { 

    constructor(navigationService) { 
    this.availableLinks = navigationService.availableLinks; 
    } 
} 

LinksController.$inject = ['NavigationService']; 

ナビゲーション/ index.js

... 
import NavigationService from './navigation-service'; 
import LinksController from './links-controller'; 

export default angular.module('app.links', [uirouter]) 
    .config(routing) 
    .service('NavigationService', NavigationService) 
    .controller('LinksController', LinksController) 
    .name; 

例flowtype出力

LinksController.$inject = ['NavigationService']; 
       ^^^^^^^ property `$inject`. Property not found 
+0

私は本当にFlowtypeを使用していませんが、あなたのコントローラには '$ inject'プロパティが直接宣言されていないので、実際にはFlowtypeは正しいです。おそらく '$ inject'キーワードを無視するように設定を変更することができます。 –

+0

** flow **は、指定した正規表現に一致するファイルを無視するように指示できます。特定のルールやキーワードを無視するオプションはありません。 –

答えて

3

この理由は、クラスを作成することによってFlowでそのインターフェースを定義しているからです。

$injectをクラスに割り当てると、クラスインターフェイスで定義されていない新しいプロパティが効果的に追加されます。これはフローのタイプエラーです。

class LinksController { 
    static $inject = ['NavigationService']; 
    constructor() {...} 
} 

:静的プロパティを追加

class LinksController { 
    static $inject: Array<string>; 
    constructor() {...} 
} 

LinksController.$inject = ['NavigationService']; 

:静的プロパティの型定義を追加

あなたは、このタイプの流れにチェックを行うための2つのオプションがあります2番目のオプションでは、esproposal.class_static_fields=enableウィットを有効にする必要がありますあなたの.flowconfig

[options]セクションをホアヒンこれは提案まだJavaScriptの標準に追加されていないし、任意のブラウザでは利用できないので、あなたもBabelようなもので、それをコンパイルする必要があります(あなたがstage-2 presetかのいずれかが必要ですtransform-class-properties plugin)。

+0

ありがとうございます。私はすでに2番目のアプローチを試していましたが、クラスフィールドと静的プロパティはステージ2にありますので、私はそれらを使いたいかどうかわかりません。私は、静的なプロパティ型定義を持つスーパークラスを定義し、$ injectについての不平を言わなければなりません。 –

-3

あなたは、外部依存性の注入を使用しているなら、あなたは以下のような機能をリンクしたい場合があります。

angular 
    .module('app',[]) 
    .controller('LinkCtrl', LinkCtrl); 

LinkCtrl.$inject = ['NavigationService']; 

あなたが上記のように完全にスニッパーを共有してもらえますか?

+0

いくつかの例で私の質問を更新しました。 AngularJSアプリはそれ自体で動作しており、サービスとコントローラがどのように登録または注入されるかは問題ではありません。それは、フローがプロパティの不足を不平にしているということだけです。 –

+0

角度jに対して作成したインターフェイスファイルを共有できますか? – Jayesh

関連する問題