问题描述
给定一些可空类型 T?
,我如何获得相应的不可空类型 T
?
例如:
T? x<T extends int?>(T? valor) => valor;
Type g<T>(T Function(T) t) => T;
Type type = g(x);
print(type); // Prints "int?"
现在我想获得不可为空的类型。我如何创建函数 convert
以便:
Type nonNullableType = convert(type);
print(nonNullableType); // Prints "int"
解决方法
如果您有 T?
的实例,我认为您可以这样做:
Type nonNullableTypeOf<T>(T? object) => T;
void main() {
int x = 42;
int? y;
print(nonNullableTypeOf(x)); // Prints: int
print(nonNullableTypeOf(y)); // Prints: int
}
如果您只有 T?
本身(Type
对象),那么我不相信您可以做很多事情,因为您可以使用 Type
对象做的事情非常有限. (鉴于这些限制,目前还不清楚 nonNullableTypeOf
最终是否会非常有用。)
相关问题:How do I check whether a generic type is nullable in Dart NNBD?
,一般来说,你不会。没有简单的方法可以去除类型的 ?
,或以其他方式解构类型。 (您也无法在运行时找到您知道的 T
类型的 List<T>
)
如果您将类型作为 Type
对象,则您无法使用它。您几乎不需要使用 Type
对象。
如果您将类型作为类型参数,那么类型系统实际上并不知道它是否可以为空。示例:
void foo<T>() { ... here T can be nullable or non-nullable ... }
即使您测试 null is T
以检查类型实际上是否可以为 null,类型系统 也不会变得更智能,这不是它可以派生类型信息的测试之一来自。
唯一可以改进的类型是变量类型(或者更确切地说,当前存储在变量中的单个值的类型)。因此,如果您有 T x = ...;
并且您执行 if (x != null) { ... x is not null here }
,则可以将变量提升为 T&Object
,但这只是允许您调用变量成员的中间类型,它不是可以捕获为类型变量或变量类型的真实类型。它不会帮助你。
总而言之,这是不可能的。当您拥有可空类型时,为时已晚,您需要在添加 ?
之前捕获它。
你真正想解决什么问题?
,如果您有一个 T?
实例,并且您正在尝试执行预期类型为 T
的某些操作,则可以在 dart 显示错误的任何地方使用 T!
。它不完全是从 T?
到 T
的转换,它只是进行空检查的快捷方式。