API компилятора TypeScript: как получить тип с разрешенными аргументами типа?

Я хочу объединить объявления классов в файл .dt.s, чтобы создать более чистый общедоступный API. Я застрял в том, как заставить эту работу работать с аргументами универсального типа. Допустим, у меня есть:

class A1<T> { // Non-exported class I want to hide
  data?: T;
}

export class B1 extends A1<string> {
}

В идеале я хочу превратить это в:

export class B1 {
  data?: string;
}

Я могу получить тип A1, а затем скопировать его члены. Но как получить разрешенную версию A1, в которой используется string вместо T?

Для справки это мой текущий код:

for (const heritageClause of node.heritageClauses) {
  for (const type of heritageClause.types) {
    if (isExported(type.modifiers)) {
      exportedTypes.push(type);
    } else {
      const privateType = typeChecker.getTypeAtLocation(type);
      if (privateType?.symbol?.members) {
        privateType.symbol.members.forEach((definition, memberName) => {
          if (!currentMembers || !currentMembers.has(memberName)) {
            additionalMembers.push(...definition.declarations);
           }
         }
      });
    }
  }
}

person Sebastian Schmidt    schedule 17.09.2020    source источник


Ответы (1)


Я считаю, что вы ищете метод TypeChecker#getTypeOfSymbolAtLocation(symbol, node).

Следующее должно получить разрешенный тип string | undefined:

// by the way, recommend renaming `type` to `typeNode` to avoid confusion
typeChecker.getTypeOfSymbolAtLocation(privateType.getProperties()[0], type);
person David Sherret    schedule 17.09.2020