Dart specification states:
Reified type information reflects the types of objects at runtime and may always be queried by dynamic typechecking constructs (the analogs of instanceOf, casts, typecase etc. in other languages).
Sounds great, but there is no instanceof
-like operator. So how do we perform runtime type-checking in Dart? Is it possible at all?
This question is related to
dynamic
dart
instanceof
dart-mirrors
Dart Object
type has a runtimeType
instance member (source is from dart-sdk
v1.14, don't know if it was available earlier)
class Object {
//...
external Type get runtimeType;
}
Usage:
Object o = 'foo';
assert(o.runtimeType == String);
Simply call
print(unknownDataType.runtimeType)
on the data.
object.runtimeType
returns the type of object
For example:
print("HELLO".runtimeType); //prints String
var x=0.0;
print(x.runtimeType); //prints double
Just to clarify a bit the difference between is
and runtimeType
. As someone said already (and this was tested with Dart V2+) the following code:
class Foo {
Type get runtimeType => String;
}
main() {
var foo = new Foo();
if (foo is Foo) {
print("it's a foo!");
}
print("type is ${foo.runtimeType}");
}
will output:
it's a foo!
type is String
Which is wrong. Now, I can't see the reason why one should do such a thing...
As others have mentioned, Dart's is
operator is the equivalent of Javascript's instanceof
operator. However, I haven't found a direct analogue of the typeof
operator in Dart.
Thankfully the dart:mirrors reflection API has recently been added to the SDK, and is now available for download in the latest Editor+SDK package. Here's a short demo:
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.");
}
There are two operators for type testing: E is T
tests for E an instance of type T while E is! T
tests for E not an instance of type T.
Note that E is Object
is always true, and null is T
is always false unless T===Object
.
Source: Stackoverflow.com