在 Dart 中,给定可空类型 `T?`,如何获得不可空类型的 `T`

时间:2021-04-24 19:49:35

标签: dart types non-nullable

给定一些可空类型 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"

3 个答案:

答案 0 :(得分:2)

如果您有 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?

答案 1 :(得分:2)

一般来说,你不会。没有简单的方法可以去除类型的 ?,或以其他方式解构类型。 (您也无法在运行时找到您知道的 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,但这只是允许您调用变量成员的中间类型,它不是可以捕获为类型变量或变量类型的真实类型。它不会帮助你。

总而言之,这是不可能的。当您拥有可空类型时,为时已晚,您需要在添加 ? 之前捕获它。

你真正想解决什么问题?

答案 2 :(得分:0)

如果您有一个 T? 实例,并且您正在尝试执行预期类型为 T 的某些操作,则可以在 dart 显示错误的任何地方使用 T!。它不完全是从 T?T 的转换,它只是进行空检查的快捷方式。

相关问题