我想知道是否可以通过某种方式扩展或挂接到TypeScript编译器,并根据代码中TypeScript接口的声明生成一些函数。基本上,这些函数将验证来自服务器的数据对象是否符合这些对象应该实现的TypeScript接口。我在考虑有一个特殊的接口标记,我希望我的编译器钩子是由这样的接口触发的。一旦检测到该标记接口,我将分析该接口的成员并生成代码,该代码将根据该接口定义的数据契约来验证给定的对象。有没有办法做到这一点?有人能给我指路吗?
发布于 2019-02-11 09:31:52
Short answer
是的(多亏了TypeScript转换器),而且已经有一个类似的工具叫做typescript-is。
Long answer
转换器是一个函数,您的程序的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 doesn't support plugins out of the box还没有。ttypescript就是这样一个包装器的例子。
发布于 2014-01-18 09:27:09
这似乎是一个有趣的想法。我认为您最终可能需要修改编译器代码才能做到这一点;标准的"tsc“不会导出类型信息,但我认为它不会导出您想要的类型信息。
您可以从查看一些与TS编译器进行编程集成的代码开始。例如,grunt类型的脚本模块:https://github.com/k-maru/grunt-typescript/blob/master/src/modules/compiler.ts
不过,这似乎不是一个微不足道的问题。一种方法是创建引用某个数据对象的TS代码,并尝试对其进行编译,以查看该数据是否符合接口。如果你最终不得不使用编译器本身来做这个验证,你可能会发现它对于实时使用来说太慢了。
或者,如果您自己基于标记接口生成代码,您可能最终会重新实现许多编译器,因为类型系统可能会变得非常复杂(泛型、函数声明和结构子对象)。
https://stackoverflow.com/questions/21174763
复制相似问题