Dart FutureOr<;T>;拥有具体化的未来<;T>;/&书信电报;T>;?

Dart FutureOr<;T>;拥有具体化的未来<;T>;/&书信电报;T>;?,dart,Dart,我在AngularDart有一门课,内容如下: abstract class Validator { Map validate(AbstractControl c); } 仔细看,这曾经是(在我们添加强模式支持之前): 它在技术上支持返回未来或地图的问题 我想重构它,并使用FutureOr正确键入它: abstract class Validator { FutureOr<T> validate(AbstractControl c); } 我想得对吗 编辑:如下所述,我的

我在AngularDart有一门课,内容如下:

abstract class Validator {
  Map validate(AbstractControl c);
}
仔细看,这曾经是(在我们添加强模式支持之前):

它在技术上支持返回未来或地图的问题

我想重构它,并使用
FutureOr
正确键入它:

abstract class Validator {
  FutureOr<T> validate(AbstractControl c);
}
我想得对吗

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

if (result is Future<T>) {

} else if (result is T) {

}

是的,您可以执行
结果是未来的
validate
方法返回的实际值要么是
Future
,要么不是。函数的静态类型不会影响这一点,而且由于
FutureOr
不是实际的类,因此不能有一个对象是“FutureOr”。它要么是一个真实的
未来
,要么是一张
地图

对于第二个问题,这取决于你所说的“匹配”是什么意思。 您可以使用返回
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) {...} 
}
实际上,验证器
v
的具体
validate
方法可能会分配给
f1
f2
中的一个,但其静态类型没有说明是哪一个,因此这两个都被视为错误的分配

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

是,对不起,
FutureOr
FutureOr
if (result is Future<T>) {

} else if (result is T) {

}
Future<Map> AsyncValidate(AbstractControl c);

Map SyncValidate(AbstractControl c);
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) {...} 
}
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.