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

Lui*_*gas 5 analyzer dart dart-analyzer

我怎样才能使用类元素的亚型DartTypeanalyzer包装?

例如,如果类型是List<String>,我想得到String. 如果类型是generic.

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

mat*_*rey 8

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

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

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

我不知道是否有可能知道类型是否为泛型——毕竟它只是一个类型。但是您可以再次使用以下命令检查该类型是否接受泛型参数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;
}
Run Code Online (Sandbox Code Playgroud)

希望有帮助!