La especificación de dardo dice:
La información de tipo reificada refleja los tipos de objetos en tiempo de ejecución y siempre puede ser consultada por construcciones dinámicas de verificación de tipo (los análogos de instanceOf, casts, typecase, etc. en otros lenguajes).
Suena genial, pero no hay un instanceofoperador similar. Entonces, ¿cómo realizamos la verificación de tipos en tiempo de ejecución en Dart? ¿Es posible en absoluto?
dynamic
dart
instanceof
dart-mirrors
Ídolo
fuente
fuente

isoperador en absoluto en la especificación. Es mejor consultar el archivo de gramática en las fuentes de Dart: code.google.com/p/dart/source/browse/trunk/dart/language/…isoperador se define en la página 59 de la especificación, sección 10.30 'Prueba de tipo'isyis!se puede encontrar en la sección Operadores del recorrido lingüístico de Dart.getTypeName(dynamic obj) => obj.runtimeType;!=perois!... me confunde, no lo haceEl
Objecttipo de dardo tiene unruntimeTypemiembro de instancia (la fuente es dedart-sdkv1.14, no sé si estaba disponible antes)Uso:
fuente
runtimeTypelas clases pueden anularlo, aunque no puedo pensar en una razón por la que lo harían. (el código externo no puede establecer el valor porque es un captador) Personalmente, me apegaría a unaisreflexión.runtimeTypetenga estas limitaciones.runtimeTypesolo debería utilizarse con fines de depuración? Lo pregunto porque no hay ninguna mención de esto en los documentos de Object, o en otro lugar (que pueda encontrar).object.runtimeTypedevuelve el tipo de objetoPor ejemplo:
fuente
Como han mencionado otros, el
isoperador de Dart es el equivalente alinstanceofoperador de Javascript . Sin embargo, no he encontrado un análogo directo deltypeofoperador en Dart.Afortunadamente, la API de reflexión de dart: mirrors se ha agregado recientemente al SDK y ahora está disponible para descargar en el último paquete Editor + SDK . Aquí hay una breve demostración:
fuente
Unsupported operation: dart:mirrors is no longer supported for web appsHay dos operadores para las pruebas de tipo:
E is Tprueba para E una instancia de tipo T mientras queE is! Tprueba para E no una instancia de tipo T.Tenga en cuenta que
E is Objectsiempre es cierto ynull is Tsiempre es falso a menos queT===Object.fuente
T===Object? Dart no tiene el operador triple igual, pero eligió usarlo en lugar de doble igual, así que supongo que la diferencia tiene importancia.null is Objectque sería cierto peronull is Tfalso para cualquier otro tipo T. tbh, aunque no he estado cerca de Dart durante muchos años, así que no puedo estar seguro.Solo para aclarar un poco la diferencia entre
isyruntimeType. Como alguien dijo ya (y esto fue probado con Dart V2 +) el siguiente código:dará salida:
Cuál está mal. Ahora, no veo la razón por la que uno debería hacer tal cosa ...
fuente