Как выполнить проверку типа времени выполнения в Dart?
Спецификация Dart:
Информация типа Reified отражает типы объектов во время выполнения и всегда может запрашиваться динамическими конструкциями проверки типов ( аналогов экземпляра instanceOf, casts, typecase и т.д. на других языках).
Звучит здорово, но нет оператора instanceof
. Итак, как мы выполняем проверку типов во время выполнения в Dart? Возможно ли вообще?
Ответы
Ответ 1
Оператор instanceof называется is
в Dart. Спектр не совсем дружелюбен к случайному читателю, поэтому лучшее описание прямо сейчас выглядит http://www.dartlang.org/articles/optional-types/.
Вот пример:
class Foo { }
main() {
var foo = new Foo();
if (foo is Foo) {
print("it a foo!");
}
}
Ответ 2
Как отмечали другие, оператор Dart is
является эквивалентом оператора Javascript instanceof
. Однако я не нашел прямого аналога оператора typeof
в Дарте.
К счастью, dart: mirror reflection API недавно был добавлен в SDK и теперь доступен для загрузки в последний пакет Editor + SDK. Здесь короткая демонстрация:
import 'dart:mirrors';
getTypeName(dynamic obj) {
return reflect(obj).type.reflectedType.toString();
}
void main() {
var val = "\"Dart is dynamically typed (with optional type annotations.)\"";
if (val is String) {
print("The value is a String, but I needed "
"to check with an explicit condition.");
}
var typeName = getTypeName(val);
print("\nThe mirrored type of the value is $typeName.");
}
Ответ 3
Существует два оператора для тестирования типов: E is T
проверяет для E экземпляр типа T, а E is! T
проверяет E, а не экземпляр типа T.
Обратите внимание, что E is Object
всегда истинно, а null is T
всегда false, если T===Object
.
Ответ 4
Тип Dart Object
имеет член экземпляра runtimeType
(источник от dart-sdk
v1.14, не знаю, было ли это ранее)
class Object {
//...
external Type get runtimeType;
}
Использование:
Object o = 'foo';
assert(o.runtimeType == String);
Ответ 5
object.runtimeType
возвращает тип объекта
Например:
print("HELLO".runtimeType); //prints String
var x=0.0;
print(x.runtimeType); //prints double