有没有办法在 Dart 中执行可选转换?

Agu*_*ana 5 dart

在 Swift 或 Kotlin 中我可以做这样的事情

var fullName = myMap["fullName"] as? String
Run Code Online (Sandbox Code Playgroud)

那么fullName数据类型将是可选的字符串(字符串?)。

我需要在类型检查后获得可选类型

我无法直接对该映射执行空合并运算符,因为 dart 会给出奇怪的结果。例如像这样

// 'data' is Map<String, dynamic>

final fullName = data["fullname"] ?? "John Doe";
final double myNumber = fullName;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

正如你所看到的,IDE根本不会显示错误,我希望这fullName将是一个字符串,所以当我将一个字符串分配给需要双精度的字符串时,它会出现错误myNumber

jam*_*lin 5

如果您事先知道这data["fullname"]是 a String,那么您可以这样做:

final fullName = (data["fullname"] ?? "John Doe") as String;
Run Code Online (Sandbox Code Playgroud)

如果在运行时data["fullname"]结果不是a String,您将因转换失败而收到运行时异常。如果这是您需要处理的事情,那么您可以轻松地创建一个简单的辅助函数,dynamic首先检查一个值是否是所需的类型,null如果不是则返回:

T? tryCast<T>(dynamic object) => object is T ? object : null;

final fullName = tryCast<String>(data["fullname"]) ?? "John Doe";
Run Code Online (Sandbox Code Playgroud)

现在fullName静态地知道是 a String,并且意外地将其分配给 adouble将是一个编译时错误。