gpt4 book ai didi

dart - FutureOr 是否有 Future/ 的具体化类型?

转载 作者:行者123 更新时间:2023-12-02 00:03:28 27 4
gpt4 key购买 nike

我在 AngularDart 中有一个类,如下所示:

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

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

abstract class Validator {
validate(AbstractControl c);
}

技术上支持返回FutureMap的问题。

我想重构它并使用 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:

Future<Map> AsyncValidate(AbstractControl c);

Map SyncValidate(AbstractControl c);

最佳答案

是的,你可以这样做result is Future<Map>validate 返回的实际值方法是 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) {...}
}

也就是说,您可以使用您提到的函数类型之一作为 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可能会分配给 f1 中的一个f2 ,但它的静态类型没有说明是哪一个,因此两者都被认为是错误的赋值。

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

关于dart - FutureOr<T> 是否有 Future<T>/<T> 的具体化类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42098554/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com