在 Dart 中,给定可为 null 的类型“T?”,我如何获得不可为 null 的类型“T”

In Dart, given the nullable type `T?`, how do I get the non-nullable one `T`

给定一些可空类型 T?,我如何获得相应的不可空类型 T

例如:

T? x<T extends int?>(T? value) => value;
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 最终是否会非常有用。)

相关问题:

一般来说,你不会。没有简单的方法可以去除类型的 ? 或以其他方式解构类型。 (你也找不到 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 显示的任何地方使用 use T!错误。它不完全是从 T?T 的转换,它只是进行空检查的快捷方式。