173

Dart 规范指出:

具体类型信息反映了运行时对象的类型,并且总是可以通过动态类型检查构造(其他语言中的 instanceOf、casts、typecase 等的类似物)来查询。

听起来不错,但没有instanceof-like 运算符。那么我们如何在 Dart 中执行运行时类型检查呢?有可能吗?

4

9 回答 9

240

is在 Dart中调用 instanceof-operator 。该规范对普通读者并不完全友好,因此目前最好的描述似乎是http://www.dartlang.org/articles/optional-types/

这是一个例子:

class Foo { }

main() {
  var foo = new Foo();
  if (foo is Foo) {
    print("it's a foo!");
  }
}
于 2011-10-10T16:51:42.297 回答
64

DartObject类型有一个runtimeType实例成员(来源来自dart-sdkv1.14,不知道之前是否可用)

class Object {
  //...
  external Type get runtimeType;
}

用法:

Object o = 'foo';
assert(o.runtimeType == String);
于 2016-03-11T21:31:11.600 回答
20

正如其他人所提到的,Dart 的is运算符相当于 Javascript 的instanceof运算符。但是,我还没有找到typeofDart 中运算符的直接类似物。

值得庆幸的是,dart:mirrors 反射 API最近已添加到 SDK 中,现在可以在最新的 Editor+SDK 包中下载。这是一个简短的演示:

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.");
}
于 2012-08-30T14:01:56.300 回答
16

类型测试有两个运算符:E is T测试 E 是类型 T 的实例,而E is! T测试 E不是类型 T 的实例。

请注意,E is Object它始终为真,null is T除非 ,否则始终为假T===Object

于 2011-10-11T08:56:59.827 回答
11

精确的类型匹配是通过runtimeType属性完成的。检查实例或其任何父类型(在继承链中)是否属于给定类型是通过is运算符完成的:

class xxx {}

class yyy extends xxx {}

void main() {
  var y = yyy();
  
  print(y is xxx);
  print(y.runtimeType == xxx);
}

回报:

true
false
于 2021-03-03T11:28:59.520 回答
9

is只是为了澄清和之间的区别runtimeType。正如有人已经说过的(并且这是使用 Dart V2+ 测试的)以下代码:

class Foo {
  @override
  Type get runtimeType => String;
}
main() {
  var foo = Foo();
  if (foo is Foo) {
    print("it's a foo!");
  }
  print("type is ${foo.runtimeType}");
  
}

将输出:

it's a foo! 
type is String

这是错误的。现在,我看不出一个人应该做这种事情的原因......

于 2020-02-11T19:14:39.080 回答
9

只需调用

print(unknownDataType.runtimeType)

在数据上。

于 2020-11-08T13:07:46.353 回答
0

T 是类型

   print( T.runtimeType)

在此处输入图像描述


在此处输入图像描述

于 2022-02-21T17:10:46.063 回答
-3

print("请输入您的电话号码:\n"); var 电话号码 = stdin.readLineSync();

if(phone number.runtimeType is int == true)     // checks if the values input are integers
{
print('you have successfully input your phone number!');
}
else{
print('only numbers are allowed');
}
于 2021-07-25T09:19:00.880 回答