La spécification de la fléchette indique:
Les informations de type réifiées reflètent les types d'objets au moment de l'exécution et peuvent toujours être interrogées par des constructions de vérification de typage dynamiques (les analogues D'instanceOf, les transtypages, les typecases, etc. dans d'autres langues).
Cela sonne bien, mais il n'y a pas d'opérateur semblable à instanceof
-. Alors, comment pouvons-nous vérifier le type à l'exécution dans Dart? Est-ce possible?
L'instance-d'opérateur s'appelle is
dans Dart. La spécification n'est pas vraiment conviviale pour un lecteur occasionnel, aussi la meilleure description semble-t-elle être http://www.dartlang.org/articles/optional-types/ - .
Voici un exemple:
class Foo { }
main() {
var foo = new Foo();
if (foo is Foo) {
print("it's a foo!");
}
}
Comme d'autres l'ont mentionné, l'opérateur is
de Dart est l'équivalent de l'opérateur instanceof
de Javascript. Cependant, je n'ai pas trouvé d'analogue direct de l'opérateur typeof
dans Dart.
Heureusement, l'API Dart: mirrors reflection a récemment été ajoutée au SDK. Elle est désormais disponible au téléchargement dans le package latest Editor + SDK . Voici une courte démo:
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.");
}
Il existe deux opérateurs pour le test de type: E is T
teste pour E une instance de type T tandis que E is! T
teste pour E not une instance de type T.
Notez que E is Object
est toujours vrai et null is T
est toujours faux sauf si T===Object
.
Le type Dart Object
a un membre d'instance runtimeType
(la source provient de Dart-sdk
v1.14, je ne sais pas s'il était disponible auparavant)
class Object {
//...
external Type get runtimeType;
}
Usage:
Object o = 'foo';
assert(o.runtimeType == String);
object.runtimeType
renvoie le type d'objet
Par exemple:
print("HELLO".runtimeType); //prints String
var x=0.0;
print(x.runtimeType); //prints double
Un petit paquet peut aider à résoudre certains problèmes.
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>');
}
}
}
Résultat:
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>