Как получить универсальный тип из возвращаемого типа сигнатуры метода

Учитывая файл машинописного текста, например:

export interface Service {
  execute(): Promise<number>;
}

Как получить список всех методов и их возвращаемых типов.

В настоящее время я пытаюсь использовать API компилятора машинописного текста для достижения этой цели. Но у меня проблемы с «дженериками».

Пока у меня есть следующий код, но я не могу понять, как получить тип «число» для обещания.

let program = ts.createProgram(['./something.ts'], {});
let typeChecker = program.getTypeChecker();

for (const sourceFile of program.getSourceFiles()) {
  sourceFile.forEachChild((node: ts.Node) => {
    // I filter to make sure I've the InterfaceDeclaration.

    var interfaceDeclaration: ts.InterfaceDeclaration = node;
    interfaceDeclaration.forEachChild((child) => {    
      // I make sure it is a Method Signature.

      var method : ts.MethodSignature = child;
      var signature = typeChecker.getSignatureFromDeclaration(method);
      var returnType = typeChecker.getReturnTypeOfSignature(signature);
      var parameters = method.parameters;

      console.log("name: " + method.name.getText());
      console.log("return type: " + returnType.symbol.getName());
      console.log("parameters: " + parameters);
    })
  })
}

Какие отпечатки:

  name: execute
  return type: Promise
  parameters: []

Как я могу получить тип числа в обещании?


person Wouter    schedule 16.08.2019    source источник


Ответы (1)


Тип в этом случае - ts.TypeReference, поэтому числовой тип в обещании будет в свойстве массива typeArguments этого типа.

const returnType = typeChecker.getReturnTypeOfSignature(signature) as ts.TypeReference;

console.log(returnType.typeArguments![0]);
person David Sherret    schedule 17.08.2019