有没有一种方法可以连接到TypeScript编译器,并基于TypeScript代码模型发出一些自定义JavaScript



我想知道是否可以以某种方式扩展或连接到TypeScript编译器,并根据代码中TypeScript接口的声明生成一些函数。基本上,这些函数将验证来自服务器的数据对象,使其符合对象应该实现的TypeScript接口。我想有一个特殊的接口标记,我希望我的编译器挂钩是由这样的接口触发的。一旦检测到该标记接口,我就会分析该接口的成员,并生成代码,根据该接口定义的数据契约验证给定对象。有办法做到这一点吗?有人能给我指路吗?

简短回答

是的(多亏了TypeScript转换器),而且已经存在一种叫做TypeScript的工具。

长答案

转换器是一个函数,您的程序的AST将为其公开。一个基本的例子:

import * as ts from 'typescript';
export default (program: ts.Program) => {
return (ctx: ts.TransformationContext) => {
return (sourceFile: ts.SourceFile) => {
function visitor(node: ts.Node): ts.Node {
/**
* If that's the kind of node you were looking for,
* do something with it and return it. Otherwise:
*/
return ts.visitEachChild(node, visitor, ctx);
}
return ts.visitEachChild(sourceFile, visitor, ctx);
};
};
}

这样的转换器可以通过编程方式使用。如果你想让它成为tsconfig.json中使用的独立插件,你需要一个支持它的TypeScript编译器的包装器,因为TypeScript还不支持开箱即用的插件。ttypescript就是这样一个包装器的例子。

这似乎是一个有趣的想法。我认为你可能最终需要修改编译器代码来完成这项工作;除了--declaration命令行选项之外,标准的"tsc"不导出类型信息,我认为这不符合您的要求。

您可以从查看一些与TS编译器进行了编程集成的代码开始。例如,grunt类型的脚本模块:https://github.com/k-maru/grunt-typescript/blob/master/src/modules/compiler.ts

尽管如此,这似乎是一个无关紧要的问题。一种方法是创建引用某个数据对象的TS代码,并尝试对其进行编译,以查看该数据是否符合接口。如果你最终不得不使用编译器本身来进行验证,你可能会发现它对于实时使用来说太慢了。

或者,如果你自己基于标记接口生成代码,你可能会重新实现很多编译器,因为类型系统可能会变得非常复杂(想到泛型、函数声明和结构子对象)

最新更新