在下面的代码中,我预计会出现错误,因为有效负载应该是not await postApi(payload, api);
的实例,但 Dart 不会抱怨。该类在后端和前端之间共享,以避免错误,但如果编译器不抱怨,它就没用。如何才能做到这一点?(可能是 Dart 中的另一个错误,是的,但是有解决方法或调整使其工作吗?)Foo
String
MyRequest
typedef JsonMap = Map<String, dynamic>;
enum ApiRoutes {
nextDuel,
}
abstract class BaseRequestResponse<I, O> {
ApiRoutes get api;
I fromJsonReq(JsonMap json);
JsonMap toJsonRes(O model);
O fromJsonRes(JsonMap json);
JsonMap toJsonReq(I model);
}
class Foo {}
class Bar {}
class MyRequest extends BaseRequestResponse<Foo, Bar> {
@override
ApiRoutes get api => ApiRoutes.nextDuel;
@override
Foo fromJsonReq(JsonMap json) {
return Foo();
}
@override
Bar fromJsonRes(JsonMap json) {
return Bar();
}
@override
JsonMap toJsonReq(Foo model) {
return {};
}
@override
JsonMap toJsonRes(Bar model) {
return {};
}
}
Future<O> postApi<I, O>(I payload, BaseRequestResponse<I, O> api) async {
return api.fromJsonRes({});
}
void main() {
callApi();
}
Future<Bar> callApi() async {
final String payload = 'wrong';
final api = MyRequest();
final data = await postApi(payload, api);
return data;
}
当您使用(和)
postApi
的两种不同候选类型进行调用时,将推断出它们最接近的公共基本类型,即。因此你的电话被推断为. 这是一个有效的推论,尽管这不是您想要的。(您可以通过添加到 的正文来验证这是否发生了。)I
String
Foo
I
Object
postApi
postApi<Object, Bar>
print('I: $I, O: $O')
postApi
如果您不想在每个调用站点显式指定类型参数,一种约束方法
postApi
是分解调用,以便I
必须首先仅从一个参数确定类型参数。例如:这会生成一条错误消息:
但当
payload
是 的实例时才有效Foo
。