如何在Dart中检查类型参数是否为特定类型?

时间:2019-03-22 21:35:32

标签: dart

如果通用类型的参数是Stream,我有一些Dart代码要在其中实现特殊行为。

是这样的:

class MyType<A> {
    A doit() {
        if (A is Stream) // doesn't work!
        else something-else;
    }
}

这可能吗?

3 个答案:

答案 0 :(得分:1)

您不能使用A is Stream,因为A实际上是一个Type实例。但是,您可以使用if (A == Stream)或虚拟实例if (new Stream() is A)

答案 1 :(得分:0)

要检查类型参数是否为特定类型,可以使用bool isTypeOf<ThisType, OfType>()包中的type_helper函数。如果此类型相同或为其他子类型,则返回true,否则返回false

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>');
    }
  }
}

结果:

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>

答案 2 :(得分:0)

您通常可以使用A == Stream,但您说的是Stream<SomeType>

如果type始终为Stream,则可以使用具有的type参数创建虚拟实例:

class MyType<A> {
  A doit() {
    final instance = Stream<A>();

    if (instance is Stream<SomeType>) { // ... }
    else if (instance is Stream<OtherType>) { // ... }
  }