gpt4 book ai didi

typescript - 运行 Typescript 编译器插件/转换器后进行类型检查

转载 作者:行者123 更新时间:2023-12-04 00:29:30 27 4
gpt4 key购买 nike

我正在关注有关如何编写 Typescript 编译器插件/转换器的博客 ( https://dev.doctorevidence.com/how-to-write-a-typescript-transform-plugin-fc5308fdd943)。

在应用第一个应该引入类型错误的简单转换后(在不具有该属性的对象上访问的某些属性),我注意到没有显示类型错误。事实上,编译器会正常进行。

import * as ts from "typescript";

export const transformerFactory = (
program: ts.Program
): ts.TransformerFactory<ts.SourceFile> => {
return (context: ts.TransformationContext): ts.Transformer<ts.SourceFile> => {
const visitor: ts.Visitor = (node: ts.Node): ts.VisitResult<ts.Node> => {
if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {
if (node.expression.escapedText === "someCall") {
return ts.createCall(
ts.createPropertyAccess(node.expression, "nonExisting"),
node.typeArguments,
node.arguments
);
}
}
return ts.visitEachChild(node, visitor, context);
};

return (sf: ts.SourceFile) => ts.visitNode(sf, visitor);
};
};

应用于index.ts:

declare function someCall(...args: any[]): string;

console.log(someCall(1, 2, true));

产生 index.js:

console.log(someCall.nonExisting(1, 2, true));

(即使使用 noEmitOnError: true)

这是有意为之的行为吗?这是我可以在某处启用的功能吗?

最佳答案

Is this intended behavior?

是的。

Is this something I can enable somewhere?

不,变压器的用途有限。不支持编译器的通用通用“插件”。

变形金刚作为“发射”阶段的一部分运行,该阶段从经过类型检查的 AST 生成 javascript 代码。

This comment在变形金刚 PR 中说

Transforms, all of them, happen after the checking phase has happened

更新

is there some way to compile twice: once to transform the file and once to type-check the whole thing? I don't mind if I have to run a separate check for the transformed files.

我不知道。首先要尝试的是让您的转换器像以前一样修改 AST,然后通过调用手动对修改后的文件进行类型检查

program.getDiagnosticsProducingTypeChecker().getDiagnostics(sourceFile)

(getDiagnostics 有第二个参数 - cancellationToken - 但忽略它似乎是安全的,因为它总是在 undefined类型检查代码。一般来说,你可以在它自己的源代码中查看各种编译器API是如何使用的,例如emit首先通过调用各种program.getNNNDiagnostics来进行类型检查,然后运行emitter转换。)

这可能有效也可能无效,因为类型检查器会修改 AST,并且它取决于 AST 处于正确的状态。

然后,您可能想查看 builder API - 它的目的是监视源文件的修改并重新编译更改的文件(source code link)。我不知道在 AST 修改后重新编译它会有多难,而且看起来您将无法使用变形金刚中可用的访问者;你必须手动遍历 AST。

此外,还有 ts-simple-ast库,其声明的目的是“提供一种简单的方法来导航和操作 TypeScript 和 JavaScript 代码”。我自己没有使用过它,也不知道它对您的目标有多大用处。

关于typescript - 运行 Typescript 编译器插件/转换器后进行类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53448691/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com