避免在 Dart 中重复空类型检查
Avoid duplication of null type checking in Dart
我当前的目标是删除此代码重复:
final int? myNullableInt = 10;
/// Everywhere I need to do this null verification:
if (myNullableInt == null) return null;
return someOtherMethodThatReceivesANonNullableInt(myNullableInt);
我想转换成我们在 Kotlin 中拥有的东西:
final int? myNullableInt = 10;
return myNullableInt?.apply((myInt) => someOtherMethodThatReceivesANonNullableInt(myInt));
我做到了:
extension ApplyIfNotNull on Object? {
T? apply<T extends Object?>(Object? obj, T? Function(Object) fn) {
if (obj == null) return null;
return fn(obj);
}
}
但这给了我一个静态错误:
The argument type 'Object' can't be assigned to the parameter type 'int'.
注意:这应该适用于所有类型,例如 int
s、String
s、double
和 MyOwnClassType
s。
有什么我可以做的吗?还是我遗漏了什么?
extension ApplyIfNotNull on Object? {
T? apply<T extends Object?>(Object? obj, T? Function(Object) fn) {
if (obj == null) return null;
return fn(obj);
}
}
那是行不通的,因为它声明回调能够接受任何 Object
参数,但您可能正在尝试将它与仅接受 int
参数的函数一起使用.也不清楚为什么你做了一个扩展方法,因为它根本不涉及接收器 (this
)。
您还需要使您的函数在回调的参数类型上通用:
R? applyIfNotNull<R, T>(T? obj, R Function(T) f) =>
(obj == null) ? null : f(obj);
(这与我在 https://github.com/dart-lang/language/issues/360#issuecomment-502423488 中建议的相同,但参数相反。)
或者,作为扩展方法,它可以在 this
上工作,而不是使用额外的 obj
参数:
extension ApplyIfNotNull<T> on T? {
R? apply<R>(R Function(T) f) {
// Local variable to allow automatic type promotion. Also see:
// <https://github.com/dart-lang/language/issues/1397>
var self = this;
return (self == null) ? null : f(self);
}
}
另请参阅 https://github.com/dart-lang/language/issues/360 以了解现有语言功能请求以及同时建议的其他一些解决方法。
我当前的目标是删除此代码重复:
final int? myNullableInt = 10;
/// Everywhere I need to do this null verification:
if (myNullableInt == null) return null;
return someOtherMethodThatReceivesANonNullableInt(myNullableInt);
我想转换成我们在 Kotlin 中拥有的东西:
final int? myNullableInt = 10;
return myNullableInt?.apply((myInt) => someOtherMethodThatReceivesANonNullableInt(myInt));
我做到了:
extension ApplyIfNotNull on Object? {
T? apply<T extends Object?>(Object? obj, T? Function(Object) fn) {
if (obj == null) return null;
return fn(obj);
}
}
但这给了我一个静态错误:
The argument type 'Object' can't be assigned to the parameter type 'int'.
注意:这应该适用于所有类型,例如 int
s、String
s、double
和 MyOwnClassType
s。
有什么我可以做的吗?还是我遗漏了什么?
extension ApplyIfNotNull on Object? { T? apply<T extends Object?>(Object? obj, T? Function(Object) fn) { if (obj == null) return null; return fn(obj); } }
那是行不通的,因为它声明回调能够接受任何 Object
参数,但您可能正在尝试将它与仅接受 int
参数的函数一起使用.也不清楚为什么你做了一个扩展方法,因为它根本不涉及接收器 (this
)。
您还需要使您的函数在回调的参数类型上通用:
R? applyIfNotNull<R, T>(T? obj, R Function(T) f) =>
(obj == null) ? null : f(obj);
(这与我在 https://github.com/dart-lang/language/issues/360#issuecomment-502423488 中建议的相同,但参数相反。)
或者,作为扩展方法,它可以在 this
上工作,而不是使用额外的 obj
参数:
extension ApplyIfNotNull<T> on T? {
R? apply<R>(R Function(T) f) {
// Local variable to allow automatic type promotion. Also see:
// <https://github.com/dart-lang/language/issues/1397>
var self = this;
return (self == null) ? null : f(self);
}
}
另请参阅 https://github.com/dart-lang/language/issues/360 以了解现有语言功能请求以及同时建议的其他一些解决方法。