示例代码:
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;
。
请帮我解决这个问题,非常感谢。
答案 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
数组。