API-интерфейс компилятора типов - Как определить, является ли тип свойства enum или object - PullRequest
0 голосов
/ 08 марта 2019

Мне нужно знать каждый узел объявления свойства, если это enum или другой объект.

, поэтому я получаю ссылку на тип:

 const typeReferance = (arrayType as any).typeName

Но я понятия не имею, как определить, является ли enum или объект.

Модель:

enum Color { Red, Green, Blue }
class SomeObject {
    string: string;
}
class Model {
    color:Color;
}

Посетитель:

if (node.kind === ts.SyntaxKind.PropertyDeclaration) {
  ???
}

1 Ответ

0 голосов
/ 29 марта 2019

Я обнаружил, что проверка флага типа для 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...