看下面的例子
Object text = 'IAM17'; if (text is String) { print(text.length); } 复制代码
本来 text
是 Object 类型,是没有 length 属性的,但是在 if 语句里,text 被提升为 String 类型,所以可以有 length 属性。
再看下面的例子。
class Person { String? get name => "IAM17"; getNameLength() { if (name is String) { return name.length; } } } 复制代码
这样写会报错。因为属性是无法获得提升的。为什么属性无法获得提升?因为属性的返回值是可以变化的。比如可以写成下面这样。
String? get name => Random().nextBool() ? "IAM17" : null; 复制代码
这会导致在 if 判断的时候是 "IAM17" 但是到 return name.length
的时候就变成 null 了。
因为这个原因,所以属性是不能提升的。如果想获得属性提升的便利,可以把加一个临时变量。
class Person { String? get name => Random().nextBool() ? "IAM17" : null; getNameLength() { var tmpName = name; if (tmpName is String) { return tmpName.length; } } } 复制代码
到这就结束了,在写代码的时候,可以充分利用 dart 类型提升的特性来提升效率。