web-dev-qa-db-fra.com

Comment effectuer une vérification de type à l'exécution dans Dart?

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?

34
Idolon

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!");
  }
}
55
Patrick

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.");
}
15
Rob

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.

7
Duncan

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);
3
sbedulin

object.runtimeType renvoie le type d'objet

Par exemple:

print("HELLO".runtimeType); //prints String
var x=0.0;
print(x.runtimeType); //prints double
1
Raj Yadav

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>

0
mezoni