Подтвердить что ты не робот

Как выполнить проверку типа времени выполнения в Dart?

Спецификация Dart:

Информация типа Reified отражает типы объектов во время выполнения и всегда может запрашиваться динамическими конструкциями проверки типов ( аналогов экземпляра instanceOf, casts, typecase и т.д. на других языках).

Звучит здорово, но нет оператора instanceof. Итак, как мы выполняем проверку типов во время выполнения в Dart? Возможно ли вообще?

4b9b3361

Ответ 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