【发布时间】:2020-05-19 12:50:40
【问题描述】:
如何从另一个文件中获取类型为类的属性声明的类型信息?
// person.ts
/**
* @description Some description
*/
export class Person {
name: string;
constructor() { }
}
// group.ts
export class Group {
member1: Person; // <-- Use TS typechecker to get info of Person class
member2: Person;
element: HTMLButtonElement; // <-- Getting all member and nodes for HtmlButtonElement using typechecker
constructor() { }
}
使用 TypeScript 编译器 API
import ts from 'typescript';
const parsedCMD = ts.getParsedCommandLineOfConfigFile(
`tsconfig.lib.json`,
undefined,
ts.sys as any
);
const files = parsedCMD.fileNames;
const program = ts.createProgram(files, parsedCMD.options);
const checker = program.getTypeChecker();
const sourceFile = program.getSourceFile('group.ts');
ts.forEachChild(sourceFile, (node: ts.Node) => {
if (ts.isClassDeclaration(node)) {
node.members.forEach(member => {
if (ts.isPropertyDeclaration(member)) {
const type = checker.getTypeAtLocation(member.name);
console.log(type);
/**
* Output for element: HtmlButtonElement
*
* callSignatures: undefined
* checker: {getNodeCount: ƒ, getIdentifierCount: ƒ, getSymbolCount: ƒ, getTypeCount: ƒ,
* getRelationCacheSizes: ƒ, …}
* constructSignatures: undefined
* flags: 524288
* id: 74
* members: undefined
* numberIndexInfo: undefined
* objectFlags: 2
* properties: undefined
* stringIndexInfo: undefined
* symbol: SymbolObject {flags: 65, escapedName: "HTMLButtonElement", declarations: Array(2), * members: Map(20), parent: undefined, …}
* Was able resolve Symbols and Nodes for HtmlButtonElement
*
*/
/**
* Output for member1: Person
* checker: {getNodeCount: ƒ, getIdentifierCount: ƒ, getSymbolCount: ƒ, getTypeCount: ƒ,
* getRelationCacheSizes: ƒ, …}
* flags: 1
* id: 4
* intrinsicName: "error"
* objectFlags: 0
*
* Getting error when using checker.getTypeAtLocation
*/
}
});
}
});
我想在 member1 位置访问 Person 类的成员和 jsDocComments。我可以使用checker.getTypeAtLocation 获取HtmlButtonElement 的所有成员或属性,但不能获取member1: Person 的所有成员或属性。我错过了什么?
【问题讨论】:
标签: typescript typescript-compiler-api