在typescript接口中强制执行属性顺序

在typescript接口中强制执行属性顺序,typescript,Typescript,我正在为我不控制的API构建一个typescript接口。API是基于xml的,并且期望属性按特定顺序排列。这些属性并非都是必需的,但如果它们存在,它们必须以正确的顺序出现。例如: 数据库和查询是必需的,其他的不是,但是如果它们存在,rowOffset必须位于rowCount之前,并且rowCount必须位于formatValues // Valid request <database>my data</database> <query>select * f

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

数据库和查询是必需的,其他的不是,但是如果它们存在,
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
数据库和查询是必需的,并且必须指定,其他选项转到一个对象,我们使用所需的参数对其进行扩展,并将整个内容转换为xml,然后发送给它。问题是选项将按顺序转换为xml属性,因此我需要强制执行属性的顺序,而不强制执行这些属性的存在

我以为一个映射可以做到这一点,但我不知道如何从映射中创建自定义类型。我可以做一个界面

interface OptionalParams {
    rowOffset? : string,
    rowCount? : string,
    formatValues? :string,
}

但这不会强制执行它们之间存在的相对顺序。有这样的类型可以做到这一点吗?

我在搜索相同的东西时发现了这个问题。我不知道您在这方面是否仍有问题,但我了解了ES6中的
Map
,这要归功于:

完整文件:

您的问题解决成功了吗?我没有,我最终保留了一个对象属性正确顺序的映射,并在转换为xml之前对它们重新排序。我想,无论如何,最好不要为最终用户强制执行命令。
interface OptionalParams {
    rowOffset? : string,
    rowCount? : string,
    formatValues? :string,
}