【发布时间】:2021-10-18 22:24:32
【问题描述】:
我正在编写一个 ts 转换器,它找到命名的类装饰器,然后替换装饰器的调用并传递一个映射,其中包含装饰类的所有道具的名称和类型,例如:
源文件:
import BigNumber from "bignumber.js";
@decorator()
class AClass {
aProp: BigNumber;
}
输出:
import BigNumber from "bignumber.js";
@decorator({"aProp": BigNumber})
class AClass {
aProp: BigNumber;
}
我从 PropertyDeclaration 获取道具名称和类型:
const clazzProps = [];
for (const childNode of clazz.members) {
if (ts.isPropertyDeclaration(childNode)) {
const type = typeChecker.getTypeAtLocation(childNode);
if (type.isClass()) {
clazzProps.push(ts.createPropertyAssignment(
ts.createIdentifier(childNode.name.getText()),
childNode.type.typeName
);
}
}
}
到目前为止一切顺利,但是在从输出 js 文件中删除编译导入语句后,导致源文件中的 BigNumber 仅作为类型引用,而不是作为值引用。 我的问题是,如何正确检查 BigNumber 是否不仅仅是一个类型并确保不会剥离导入?
【问题讨论】: