如何使用`analyzer`包中的`DartType`获取泛型类型的子类型?

时间:2017-01-20 02:01:39

标签: dart analyzer dart-analyzer

如何使用analyzer包中的类DartType获取元素的子类型?

例如,如果类型为List<String>,我想获得String。如果类型为generic,也会很有用。

另一个更复杂的例子是Map<String, String>,我希望得到一个子类型列表,在这种情况下:[String, String]

1 个答案:

答案 0 :(得分:3)

这个有点棘手 - 因为DartType实际上本身就有一些超级类型 - 你会感兴趣的是ParameterizedType

import 'package:analyzer/dart/element/type.dart';

Iterable<DartType> getGenericTypes(DartType type) {
  return type is ParameterizedType ? type.typeArguments : const [];
}

我不知道是否可以知道如果类型是通用的 - 毕竟,它只是一种类型。但您可以再次使用ClassElement检查接受类型的通用参数:

import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';

bool canHaveGenerics(DartType type) {
  final element = type.element;
  if (element is ClassElement) {
    return element.typeParameters.isNotEmpty;
  }
  return false;
}

希望有所帮助!