Как выполнить проверку типа во время выполнения в Dart? - PullRequest
53 голосов
/ 10 октября 2011

Состояния спецификации Dart:

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

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

Ответы [ 6 ]

70 голосов
/ 10 октября 2011

instanceof-оператор называется is в Dart.Спецификация не совсем дружелюбна для обычного читателя, поэтому лучшее описание сейчас выглядит как http://www.dartlang.org/articles/optional-types/.

Вот пример:

class Foo { }

main() {
  var foo = new Foo();
  if (foo is Foo) {
    print("it's a foo!");
  }
}
15 голосов
/ 30 августа 2012

Как уже упоминалось, оператор Дарта is является эквивалентом оператора instanceof Javascript.Тем не менее, я не нашел прямого аналога оператора typeof в Dart.

К счастью, API 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.");
}
11 голосов
/ 12 марта 2016

Dart Object тип имеет * экземпляр экземпляра runtimeType (источник от dart-sdk v1.14, не знаю, был ли он доступен ранее)

class Object {
  //...
  external Type get runtimeType;
}

Использование:

Object o = 'foo';
assert(o.runtimeType == String);
8 голосов
/ 11 октября 2011

Существует два оператора для тестирования типов: E is T тестирует для E экземпляр типа T, в то время как E is! T тестирует для E не экземпляр типа T.

Обратите внимание, что E is Object всегда истинно, а null is T всегда ложно, если T===Object.

5 голосов
/ 24 января 2019

object.runtimeType возвращает тип объекта

Например:

print("HELLO".runtimeType); //prints String
var x=0.0;
print(x.runtimeType); //prints double
0 голосов
/ 23 марта 2019

Небольшой пакет может помочь решить некоторые проблемы.

import 'dart:async';

import 'package:type_helper/type_helper.dart';

void main() {
  if (isTypeOf<B<int>, A<num>>()) {
    print('B<int> is type of A<num>');
  }

  if (!isTypeOf<B<int>, A<double>>()) {
    print('B<int> is not a type of A<double>');
  }

  if (isTypeOf<String, Comparable<String>>()) {
    print('String is type of Comparable<String>');
  }

  var b = B<Stream<int>>();
  b.doIt();
}

class A<T> {
  //
}

class B<T> extends A<T> {
  void doIt() {
    if (isTypeOf<T, Stream>()) {
      print('($T): T is type of Stream');
    }

    if (isTypeOf<T, Stream<int>>()) {
      print('($T): T is type of Stream<int>');
    }
  }
}

Результат:

B<int> is type of A<num> B<int> is not a type of A<double> String is type of Comparable<String> (Stream<int>): T is type of Stream (Stream<int>): T is type of Stream<int>

...