FutureOr <T>是否具有Retin类型的Future <T>/<T>?

mat*_*rey 5 dart

我在AngularDart中有一个课程如下:

abstract class Validator {
  Map validate(AbstractControl c);
}
Run Code Online (Sandbox Code Playgroud)

仔细观察,这曾经是(在我们添加强模式支持之前):

abstract class Validator {
  validate(AbstractControl c);
}
Run Code Online (Sandbox Code Playgroud)

它在技术上支持返回FutureMap的问题.

我想重构一下并使用FutureOr以下方法正确输入:

abstract class Validator {
  FutureOr<T> validate(AbstractControl c);
}
Run Code Online (Sandbox Code Playgroud)

我能is在运行时使用检查吗?(在DDC和dart2js中)

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

我正确地考虑了这个吗?

编辑:如下所述,我的意思是

if (result is Future<T>) {

} else if (result is T) {

}
Run Code Online (Sandbox Code Playgroud)

还有一个问题,就是validate这两个问题typedef:

Future<Map> AsyncValidate(AbstractControl c);

Map SyncValidate(AbstractControl c);
Run Code Online (Sandbox Code Playgroud)

lrn*_*lrn 3

是的,你可以做result is Future<Map>。该方法返回的实际值validate要么是 a Future,要么不是。函数的静态类型不会影响这一点,并且由于FutureOr<Map>不是实际的类,因此您不能拥有“FutureOr”的对象。它要么是真实的Future<Map> ,要么Map

对于第二个问题,这取决于“匹配”的含义。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) {...} 
}
Run Code Online (Sandbox Code Playgroud)

也就是说,您可以使用您提到的函数类型之一作为a 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.    
Run Code Online (Sandbox Code Playgroud)

validate在实践中,验证器的具体方法可能会分配给 或之一v其静态类型并没有说明是哪一个,因此两者都被认为是错误的分配。f1f2

您应该很少有声明为返回的非抽象方法FutureOr。在大多数情况下,最好总是返回 aFuture或 non- Future,并这样声明该方法。FutureOr然后,如果需要,您可以随时使用该函数作为返回,但在需要时使用更精确的类型。