我想知道我是否可以以某种方式扩展或连接到TypeScript编译器并根据我的代码中TypeScript接口的声明生成一些函数.基本上,这些函数将验证来自服务器的数据对象是否符合对象应该实现的TypeScript接口.我想有一个特殊的接口标记,我希望我的编译器的钩子是由这样的接口触发的.一旦检测到该标记接口,我将分析该接口的成员并生成将根据该接口定义的数据协定验证给定对象的代码.有没有办法做到这一点?有人可以给点指示吗?
简答
是的(多亏了 TypeScript 转换器),并且已经存在一种名为typescript-is的工具。
长答案
一个变压器是为你的程序的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);
};
};
}
Run Code Online (Sandbox Code Playgroud)
这样的转换器可以以编程方式使用。如果您希望将其作为在您的 中使用的独立插件tsconfig.json,您将需要支持该功能的 TypeScript 编译器的包装器,因为 TypeScript尚不支持开箱即用的插件。ttypescript就是这种包装器的一个例子。
这似乎是一个有趣的想法。我认为您可能最终需要修改编译器代码才能做到这一点;标准“tsc”不导出类型信息,除了 --declaration 命令行选项,我认为它不能满足您的要求。
您可以首先查看一些与 TS 编译器进行编程集成的代码。例如,grunt 类型脚本模块: https://github.com/k-maru/grunt-typescript/blob/master/src/modules/compiler.ts
尽管如此,这似乎还是一个不小的问题。一种方法是创建引用您的数据对象之一的 TS 代码,并尝试对其进行编译以查看该数据是否符合接口。如果您最终不得不使用编译器本身来进行此验证,您可能会发现它对于实时使用来说太慢了。
或者,如果您根据标记接口自己生成代码,您可能最终会重新实现许多编译器,因为类型系统可能会变得相当复杂(例如泛型、函数声明和结构子对象)
| 归档时间: |
|
| 查看次数: |
1339 次 |
| 最近记录: |