簡體   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