Состояния спецификации Dart:
Овеществленная информация о типе отражает типы объектов во времени выполнения и может всегда запрашиваться динамическими конструкциями typechecking (аналоги instanceOf, бросков, typecase и т.д. на других языках).
Звучит великолепно, но существует нет instanceof
- как оператор. Таким образом, как мы выполняем регистрирующийся в типе выполнения Dart? Действительно ли это возможно вообще?
Тип Dart Object
имеет runtimeType
член экземпляра (источник от dart-sdk
v1.14, не знайте, было ли это доступно ранее)
class Object {
//...
external Type get runtimeType;
}
Использование:
Object o = 'foo';
assert(o.runtimeType == String);
object.runtimeType
возвраты тип объекта
, Например:
print("HELLO".runtimeType); //prints String
var x=0.0;
print(x.runtimeType); //prints double
Небольшой пакет может помочь решить некоторые проблемы.
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>
Как другие упомянули, Dart is
, оператор является эквивалентом JavaScript instanceof
оператор. Однако я не нашел прямой аналог typeof
оператор в Dart.
К счастью dart:mirrors API Reflection был недавно добавлен к 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.");
}