我在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)
它在技术上支持返回Future或Map的问题.
我想重构一下并使用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)
是的,你可以做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然后,如果需要,您可以随时使用该函数作为返回,但在需要时使用更精确的类型。
| 归档时间: |
|
| 查看次数: |
676 次 |
| 最近记录: |