在 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
的转换,它只是进行空检查的快捷方式。
给定一些可空类型 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
的转换,它只是进行空检查的快捷方式。