
本文介绍了在程序编译期间将TypeScript代码转换为OData查询的过程。
在巴别塔-插件,插件ts2odata解析JavaScript的AST使用TsToOdata库中,这在我以前的文章,介绍类型化的OData在打字稿查询。
TsToOdata库的第一个版本的缺点是存在对程序包的依赖关系 巴别塔/解析器 巴别塔/遍历,在运行时解析JavaScript代码也非常昂贵。现在,这些依赖项和代码解析在单独的ts2odata-babel软件包中进行。对于开发,您可以使用ts2odata软件包,该软件包对ts2odata-babel具有devDependencies并在运行时执行请求的翻译,对于发行版,您可以将程序集与插件一起使用,该插件将在项目编译期间完成所有工作。作为该插件的结果,您的程序将仅对ts2odata和cross-fetch包具有两个依赖项。
首先,您需要安装软件包:
npm install --save-dev @babel/core @babel/cli
npm install ts2odata
npm install --save-dev babel-plugin-ts2odata
将babel.config.js文件添加到项目根目录:
module.exports = {
plugins: [
[
'babel-plugin-ts2odata',
{
odataNamespace: 'OdataToEntity.Test.Model'
}
]
]
};
如果您的OData服务不支持没有命名空间(Namespace)的枚举,则odataNamespace键对于正确转换请求是必需的。
scripts package.json:
"build": "tsc --build && npx babel ./source --out-dir ./lib"
source TypeScript, lib JavaScript .
TypeScript:
let price = 2.1;
let orders = context.Orders.filter(o => o.Items.every(i => i.Price >= price), { price })
.select(i => { return { orderYear: i.Date.getFullYear() } }).toArrayAsync();
:
let price = 2.1;
let orders = context.Orders.filter("Items/all(d:d/Price ge {price})", {
price
}).select("[{\"expression\":\"year(Date)\",\"alias\":\"orderYear\",\"kind\":1}]").toArrayAsync();
OData :
http://localhost:5000/Orders?$filter=Items/all(d:d/Price+ge+2.1)&$compute=year(Date)+as+orderYear
, code.js QueryTests.ts, output.js .
vue.js.
TypeScript, , , - .