繁体   English   中英

在 typescript 接口中执行属性顺序

[英]enforce property order in a typescript interface

我正在为我无法控制的 API 构建一个 typescript 接口。 API 是基于 xml 的,并且需要特定顺序的属性。 这些属性并非都是必需的,但如果它们存在,则它们必须按正确的顺序出现。 例子:

在此处输入图像描述

database 和 query 是必需的,其他的不是,但如果它们存在,则rowOffset必须在rowCount之前, rowCountformatValues之前

// 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中了解了Maphttps//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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM