Как получить подтипы универсального типа с помощью `DartType` из пакета` analyzer`?

Как получить подтипы элемента с помощью класса DartType из пакета analyzer?

например, если тип List<String>, я хотел бы получить String. Также будет полезно получить, если тип generic.

Другой более сложный пример - Map<String, String>, где я хочу получить список подтипов, в данном случае: [String, String].


person Luis Vargas    schedule 20.01.2017    source источник


Ответы (1)


Это немного сложно, потому что DartType сам по себе имеет несколько супертипов - вас здесь заинтересует _ 2_:

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

Надеюсь, это поможет!

person matanlurey    schedule 20.01.2017