2017-02-07 32 views
4

我有AngularDart一類爲如下:未來或未來<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... 
    } 
} 

我在想這個嗎?

編輯:正如下面提到的,我的意思是

if (result is Future<T>) { 

} else if (result is T) { 

} 

一個問題,會validate符合這兩個typedef S:

Future<Map> AsyncValidate(AbstractControl c); 

Map SyncValidate(AbstractControl c); 

回答

2

是的,你可以做result is Future<Map>validate方法返回的實際值是Future,否則它不是。該函數的靜態類型不會影響該功能,並且由於FutureOr<Map>不是實際的類,因此不能有一個「FutureOr」對象。這是一個真實的Future<Map>這是一個Map

對於第二個問題,這取決於「匹配」的意思。 您可以返回要麼MapFutureMap的方法覆蓋的方法:

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.  

在實踐中驗證的具體validate方法v可能會分配給的f1f2一個,但它的靜態類型沒有說哪一個,所以都被認爲是不好的分配。

您應該很少有一個非抽象方法,聲明爲返回FutureOr。在大多數情況下,最好總是返回Future或非Future,並聲明此方法。然後,如果需要,您可以始終使用該函數作爲返回FutureOr,但在需要時使用更精確的類型。

+0

是的,對不起,未來或未來'或'FutureOr ' – matanlurey

相關問題