【发布时间】:2017-11-22 20:42:00
【问题描述】:
我有一个看起来像这样的对象:
const object = { a: 10, an: 20 };
对象不是我定义的,而是我从其他地方收到的对象。该对象的键可以取自:
const keys = {
/**
* A long name that describes what "a" stands for.
*/
aReallyLongName: "a",
/**
* Another long name that describes what "an" stands for.
*/
anotherReallyLongName: "an"
};
为了从object 中获取10 的值,我这样写:
object[keys.aReallyLongName] // 10
有什么方法可以以类型安全的方式使用aReallyLongName 来引用object 的a 属性?
请注意,我想要一种使用长名称来引用短名称的方法,而不是相反。基本上,我想要一种以类型安全的方式(即使作为别名,它也不必在keys 对象)。
我想要一种将object.aReallyLongName 之类的东西编译为object.a 的方法,并且让编译器知道该值应该是number。
可能是这样的:
interface Data {
/**
* A long name that describes what "a" stands for.
*/
"a" as "aReallyLongName": number;
/**
* Another long name that describes what "an" stands for.
*/
"an" as "anotherReallyLongName": number;
}
object.aReallyLongName // compile to: object.a
用例
1。映射从 API 或库接收的数据
API 可能会返回缩写键、在项目上下文中看起来不正确的键或需要更多描述的键。例如,一个 API 可能会返回
{ "prop": { "cat": "Test", "long_description": "Lorem" } }
如果能够定义一个描述这个数据结构的接口就好了,但同时用properties代替prop,category代替cat和description代替@ 987654344@.
2。 MongoDB 文档键的缩写
要优化 MongoDB 中的存储,一种方法是缩写文档的键。文档可能如下所示:
{ "p": { "n": "John Doe", "a": "Example Street" } }
同样,如果能够描述此文档的键和值类型,那将是很好的,但同时使用person 而不是p,name 而不是n 和address 而不是a,无需创建 ORM 层。
【问题讨论】:
标签: typescript types