Resumen de los tres operadores (as /is/is!)
| Operador | Descripción de su función |
|---|---|
as | Conversión forzada de tipos; también sirve para definir alias de bibliotecas |
is | Comprobación de tipo: devuelve true si el objeto pertenece al tipo especificado |
is! | Comprobación de tipo: devuelve true si el objeto no pertenece al tipo especificado |
Condición para que obj is T sea verdadero: el objeto obj implementa o hereda el tipo T (incluye clases padre, interfaces y tipos anulables).
Ejemplo: Cualquier objeto is Object? siempre devuelve true.
Operador is
Comprobación segura de tipos
Verifica el tipo en tiempo de ejecución del objeto; si el resultado es true, dentro del bloque de código se puede usar directamente como ese tipo sin conversión manual. Si el objeto es null o no coincide el tipo, retorna false sin lanzar excepciones.
El siguiente ejemplo usa objetos de clase. Si aún no has estudiado las clases, puedes entenderlas como plantillas para crear datos.
class Person {
String firstName = '';
}
class Employee extends Person {}
void main() {
dynamic employee = Employee();
// Comprobación de tipo con is
if (employee is Person) {
// Al entrar en la rama, employee se reconoce automáticamente como tipo Person
employee.firstName = "Jack";
print(employee.firstName); // Muestra Jack
}
dynamic emptyObj = null;
if (emptyObj is Person) {
// No se ejecuta, null no coincide con Person
print("Coincidencia exitosa");
}
}Lenguaje del código: Dart (dart)
El código anterior define la clase Person y una clase Employee que hereda de Person.
Dentro del código usamos is para comprobar si un objeto es de tipo Person. Si es cierto, podemos usarlo directamente como Person dentro del bloque {}. Esto ocurre porque usamos tipo dinámico en dynamic employee = Employee();.
En el segundo ejemplo dynamic emptyObj = null;, al valer null, emptyObj is Person es false y el código dentro de {} no se ejecuta.
Operador is!
Comprobación inversa de tipos
Sintaxis:
variable is! tipo
Equivale simplemente a negar el resultado del operador is.
Es equivalente a !(variable is tipo), comprueba que el objeto no es el tipo destino.
Mira el ejemplo:
class Person {
String name = '';
}
void main() {
dynamic obj = "texto";
if (obj is! Person) {
print("obj no es de tipo Person");
}
}Lenguaje del código: Dart (dart)
En este ejemplo se ejecuta el código del bloque y muestra “obj no es de tipo Person”, ya que obj no es una instancia creada a partir de la plantilla Person.
Operador as
Conversión forzada de tipos
Modo de uso:
(variable as tipoDestino).propiedad/métodoLenguaje del código: JavaScript (javascript)
Úsalo solo si estás 100% seguro de que el objeto es del tipo destino; si no, se lanzará una excepción en tiempo de ejecución. Para robustez del programa, no se recomienda usarlo en exceso.
class Teacher {
String name = '';
}
void main() {
dynamic jason = Teacher();
// Conversión forzada a Teacher para acceder a la propiedad
(jason as Teacher).name = "Jason";
print((jason as Teacher).name); // Jason
}Lenguaje del código: Dart (dart)
El ejemplo anterior muestra Jason como salida
Creamos directamente una instancia de Teacher con dynamic jason = Teacher();, así que podemos garantizar al 100% que es un Teacher y no habrá errores al usarlo así.

Si escribimos el código siguiente, se producirá un error.
class Teacher {
String name = '';
}
class Car {
String name = '';
}
void main() {
dynamic jason = Teacher();
// Conversión forzada a Car para acceder a la propiedad
(jason as Car).name = "Jason";//❌error
print((jason as Car).name); //❌error
}Lenguaje del código: Dart (dart)
El error ocurre porque jason es originalmente un objeto Teacher, pero intentamos convertirlo forzosamente a Car.
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
Unhandled exception:
type 'Teacher' is not a subtype of type 'Car' in type cast
#0 main (file:///D:/dartdemo/firstdart/bin/firstdart.dart:12:10)
#1 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:314:19)
#2 _RawReceivePort._handleMessage (dart:isolate-patch/isolate-patch.dart:193:12)Lenguaje del código: PHP (php)
Comparación central entre as y is
// Forma 1: conversión forzada con as
(employee as Person).firstName = 'Bob';
// Forma 2: comprobar primero con is y luego usar
if (employee is Person) {
employee.firstName = 'Bob';
}Lenguaje del código: JavaScript (javascript)
Comportamiento cuando employee vale null o no es de tipo Person:
- Versión con as: se lanza la excepción
CastErrory el programa se detiene; - Versión con is: no entra en la rama if, sin errores ni acciones.
Aunque requiere escribir un poco más de código, prioriza el método con is, ya que mejora la estabilidad del programa.
Segundo uso de as
Segundo uso de as
as no solo sirve para conversiones de tipos: al importar bibliotecas, permite asignar un alias a la biblioteca
import 'dart:math' as math;
void main() {
// Llamar clases/métodos mediante el alias de biblioteca
print(math.pi); // Muestra 3.141592653589793
}Lenguaje del código: JavaScript (javascript)
Ejemplo completo final
class Animal {}
class Cat extends Animal {}
void main() {
dynamic obj = Cat();
// 1. Comprobación con is
if (obj is Animal) {
print("obj es de tipo Animal");
}
// 2. Comprobación inversa con is!
if (obj is! String) {
print("obj no es una cadena de texto");
}
// 3. Conversión forzada con as
Animal a = obj as Animal;
// Ejemplo erróneo que causa bloqueo
dynamic str = "hola";
// Animal error = str as Animal; // Genera CastError
}Lenguaje del código: JavaScript (javascript)