如何使用Type Checker获取Interface或Class扩展类型

时间:2017-03-15 05:47:36

标签: typescript

示例代码:

class Animal {
    name: string;
}

class Dog extends Animal {
    breed: string;
}

interface DataProps {
    color?: string;
}

interface DogProps extends DataProps {
    type?: "Beagle" | "Sheepdog";
}
在<{1}}扩展中的

我可以使用check extends names:

Class

但我不知道这是不是正确的代码。 我仍然不知道如何延长const symbol = this.checker.getSymbolAtLocation((<ts.ClassDeclaration> node).name); const extendsDocEntry = "declarations" in symbol? symbol.declarations.map((declaration: any) => ( "expression" in declaration && declaration.expression.text )).filter((extendsName: any) => extendsName) : void 0;

请帮我解决这个问题,非常感谢。

1 个答案:

答案 0 :(得分:2)

如果你看ts.ClassLikeDeclaration它有一个heritageClauses属性。此属性不是未定义的,并且包含ts.HeritageClause的对象数组。

对于每个单独的遗产条款,您可以查看token属性,看看它是ts.SyntaxKind.ExtendsKeyword还是ts.SyntaxKind.ImplementsKeyword。从那里,您可以查看types属性以获取带有类型参数的所有表达式。

获得表达式和类型参数后,您应该能够使用this.checker.getSymbolAtLocation(...)来获取正在扩展的内容的符号,或this.typeChecker.getTypeAtLocation(...)来获取该类型。

这里有一些简单的未经测试的代码可以帮助您入门......显然,您可能希望循环遍历这些数组并检查heritageClause.token,如上所述:

const classDeclaration = node as ts.ClassDeclaration;
const firstHeritageClause = classDeclaration.heritageClauses![0];
const firstHeritageClauseType = firstHeritageClause.types![0];

const extendsSymbol = this.checker.getSymbolAtLocation(firstHeritageClauseType.expression);
const extendsType = this.checker.getTypeAtLocation(firstHeritageClauseType.expression);

对于ts.InterfaceDeclaration,这几乎是相同的交易。还有heritageClauses数组。