2017-02-07 14 views
4

私は以下のようにAngularDartでクラスを持っている:(私たちは強い・モードのサポートを追加する前に)FutureOr <T>は、未来型の具体化タイプがあります<T>/<T>?

abstract class Validator { 
    Map validate(AbstractControl c); 
} 

はよく見ると、このがするを使用:

abstract class Validator { 
    validate(AbstractControl c); 
} 

問題、それは技術的にサポートしていること未来または地図を返します。

私はこれをリファクタリングし、適切FutureOrを使用して、それを入力したいと思います:

abstract class Validator { 
    FutureOr<T> validate(AbstractControl c); 
} 

私は、実行時にisチェックを使用することができるだろうか? (DDCとdart2jsで)

void runValidator(Validator v) { 
    var result = v.validate(...); 
    if (result is Future) { 
    // async... 
    } else { 
    // sync... 
    } 
} 

私はこれについて正しく考えていますか?

EDIT:はい、あなたがresult is Future<Map>を行うことができます

Future<Map> AsyncValidate(AbstractControl c); 

Map SyncValidate(AbstractControl c); 

答えて

2

:後述するように、私は

if (result is Future<T>) { 

} else if (result is T) { 

} 

もう一つ質問を意味し、validateこれら2つのtypedef Sにマッチします。 validateメソッドによって返される実際の値はFutureのいずれかです。関数の静的型は影響を与えません。FutureOr<Map>は実際のクラスではないので、 "a FutureOr"​​というオブジェクトを持つことはできません。それは実際のFuture<Map>またはです。Mapです。

2番目の質問では、「一致」が意味するものによって異なります。 あなたがMapまたはFutureMapのいずれかを返すメソッドとメソッドをオーバーライドすることができますです

abstract class Validator { 
    FutureOr<Map> validate(abstractControl c); 
} 
class AsyncValidator extends Validator { 
    Future<Map> validate(AbstractControl c) {...} 
} 
class SyncValidator extends Validator { 
    Map validate(AbstractControl c) {...} 
} 

は、あなたがValidator.validateとしてではなく、他の方向に言及した機能タイプのいずれかを使用することができます。実際に

typedef FutureOr<Map> Validate(AbstractControl c); 
typedef Future<Map> AsyncValidate(AbstractControl c); 
typedef Map SyncValidate(AbstractControl c); 
Validator v = ...; 
Validate f0 = v.validate; // Safe. 
AsyncValidate f1 = v.validate; // BAD assignment. 
SyncValidate f2 = v.validate; // BAD assignment. 

Map syncValidate(AbstractControl c) { ... } 
Future<Map> asyncValidate(AbstractControl c) { ... } 
v = syncValidate; // Good assignment. 
v = asyncValidate; // Good assignment.  

、バリvの具体的なvalidate方法は、おそらく1 f1のまたはf2に割り当て可能になりますが、その静的な型はので、両方が悪いの割り当てとみなされている1、言っていません。

戻り値がFutureOrと宣言されている非抽象メソッドはごくまれにしかありません。ほとんどの場合、ちょうど常にFutureまたは非Futureを返し、メソッドをそのように宣言する方がよいでしょう。必要な場合はいつでも関数を使用してFutureOrを返すことができますが、必要な場合にはより正確な型を使用することができます。

+0

はい、申し訳ありません、「FutureOr 」または「FutureOr ' – matanlurey

関連する問題