[英]enforce property order in a typescript interface
我正在为我无法控制的 API 构建一个 typescript 接口。 API 是基于 xml 的,并且需要特定顺序的属性。 这些属性并非都是必需的,但如果它们存在,则它们必须按正确的顺序出现。 例子:
database 和 query 是必需的,其他的不是,但如果它们存在,则rowOffset
必须在rowCount
之前, rowCount
在formatValues
之前
// Valid request
<database>my data</database>
<query>select * from some_table</query>
<formatValues>true</formatValues>
// Valid request
<database>my data</database>
<query>select * from some_table</query>
<rowOffset>1</rowOffset>
<formatValues>true</formatValues>
// Invalid request
<database>my data</database>
<query>select * from some_table</query>
<formatValues>true</formatValues>
<rowOffset>1</rowOffset> // formatValues must come after rowOffset if it exists
此请求的 typescript 签名如下所示
sqlQuery(database: string, query: string, options: object) : Promise
数据库和查询是必需的并且必须指定,其他选项 go 到 object 我们用我们需要的参数扩展它并将整个东西转换为 xml 并发送它。 问题是选项将按顺序转换为 xml 属性,因此我需要强制执行属性的顺序,而不强制这些属性的存在。
我认为 map 可以做到这一点,但我无法弄清楚如何从 map 制作自定义类型。我可以做一个接口
interface OptionalParams {
rowOffset? : string,
rowCount? : string,
formatValues? :string,
}
但这不会强制执行它们相对于彼此存在的顺序。 有没有这样的类型可以做到这一点?
我在搜索同一东西时发现了这个问题。 我不知道您是否仍然遇到麻烦,但是由于以下原因,我在ES6中了解了Map
: https : //www.jstips.co/en/javascript/map-to-the-rescue-adding-订单到对象属性/
全文: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map
由于这个问题引起了一些新的兴趣,我将发布我最终得到的解决方案。 对于每个 API 方法,我保留一个 map 的适当参数。 在我的例子中,由于每个服务都需要参数彼此之间的顺序相同,所以这变得更容易了。 也就是说,对于接受它们的任何 API 方法,行偏移量将始终在行计数之前。 map 最终看起来像这样
this.paramMap = new Map([['addRecord', ['table', 'returnModifiedData',]],
['deleteRecord', ['table', 'keyValue',]],
['getColumnInfoList', ['database', 'table',]], ... );
这个 map 然后用于在发送请求之前重新排序参数,就像这样
// Add params to the request in the propper order
addParams(params: XmlmcParams, paramMap: Array<string>): void {
let orderedParams: XmlmcParams = {};
// ensure that all the params are in the proper order
paramMap.forEach((v) => {
if (params.hasOwnProperty(v)) {
orderedParams[v] = params[v];
}
});
// add ordered params to request
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.