Разрешить структуру узла типа AST –– API компилятора TypeScript - PullRequest
1 голос
/ 03 августа 2020

Допустим, у нас есть следующий код:

interface X<Y = any> {
  y: Y;
}

interface Z extends X<"why?"> {
  abc: "ABC";
}

/**
 *
 * Structurally, the `Z` type is...
 *
 * {
 *   y: "why?";
 *   abc: "ABC";
 * }
 *
 */

Есть ли какой-либо встроенный механизм для разрешения окончательного типа из серии взаимосвязанных определений типов и / или интерфейсов? Я не могу найти ничего очевидного, поигравшись с проверкой типов и узлами типа.

Любой совет был бы очень признателен!

1 Ответ

1 голос
/ 04 августа 2020

Не существует API-интерфейса publi c для структурной типизации (см. Проблему API отношения типов ).

Тем не менее, вы можете получить все имена свойств с типами интерфейса, сделать следующее:

const interfaceZDecl = sourceFile.statements[1] as ts.InterfaceDeclaration;
const type = checker.getTypeAtLocation(interfaceZDecl.name);

for (const prop of type.getProperties()) {
    console.log(`Name: ${prop.getName()}`);
    const propType = checker.getTypeOfSymbolAtLocation(prop, prop.valueDeclaration);
    console.log(`Type: ${checker.typeToString(propType)}`);
    console.log("---");
}

Вывод:

Name: abc
Type: "ABC"
---
Name: y
Type: "why?"
---
...