避免在 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'.

注意:这应该适用于所有类型,例如 ints、Strings、doubleMyOwnClassTypes。

有什么我可以做的吗?还是我遗漏了什么?

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 以了解现有语言功能请求以及同时建议的其他一些解决方法。