Я обнаружил, что проверка флага типа для TypeFlags.Enum
не надежна (возможно, ошибка в API компилятора, но мне было лениво смотреть на это).Я получаю символ ts.Type
и проверяю, является ли его объявление значения объявлением enum.
Это не проверено, но должно дать вам основную идею:
function isEnumType(type: ts.Type) {
// if for some reason this returns true...
if (hasFlag(type.flags, ts.TypeFlags.Enum))
return true;
// it's not an enum type if it's an enum literal type
if (hasFlag(type.flags, ts.TypeFlags.EnumLiteral) && !type.isUnion())
return false;
// get the symbol and check if its value declaration is an enum declaration
const symbol = type.getSymbol();
if (symbol == null)
return false;
const { valueDeclaration } = symbol;
return valueDeclaration != null && valueDeclaration.kind === ts.SyntaxKind.EnumDeclaration;
}
function hasFlag(type: ts.Type, flag: ts.TypeFlags) {
return (type.flags & flag) === flag;
}
Проверить, не объект ли это, немного проще ...
function isObjectType(type: ts.Type) {
return hasFlag(type.flags, ts.TypeFlags.Object);
}
Кстати, если вы с ним не знакомы, тип узла можно получить из средства проверки типов:
const type = typeChecker.getTypeAtLocation(typeReference);