[英]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.