有没有办法输入一个对象,以便扩展接口的所有属性都是给定的类型?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法输入一个对象,以便扩展接口的所有属性都是给定的类型?相关的知识,希望对你有一定的参考价值。
我试图为我们使用的字典创建一个类型。我们做的有点奇怪,但我尽力解释。我们的应用程序中有一个字典,我们声明如下:
localisation: LocalDico = {
page: ['Page', 'Page'],
of: ['of', 'de'],
items: ['items', 'items'],
itemsPerPage: ['items per page', 'items par page']
};
其中索引0是英语,索引1是法语。
LocalDico类型如下:
interface LocalDico {
page: [string, string] | string;
of: [string, string] | string;
items: [string, string] | string;
itemsPerPage: [string, string] | string;
}
这背后的原因是,在我们的代码中,我们不希望总是这样
this.localDico.page[this.language]
所以我们继续把它转换成一个看起来像的对象
//Obviously this is done programatically we dont actually recode everything
localDico: LocalDico = {
page: 'Page',
of: 'Of',
items: 'Items',
itemsPerPage: 'Items per page'
}
我的目标是,如果创建本地化的人(具有多种语言的人)试图只放一个字符串就会引发错误。但是使用localDico的人不应该将它用作字符串。
基本上我想要
interface LocalDico {
page: string,
of: string,
items: string,
itemsperPage: string
}
and
interface Localisation{
page: [string, string],
of: [string, string],
items: [string, string],
itemsperPage: [string, string]
}
显然这是一个简单的字典,我们有一些有数百个条目。我不想总是复制接口我宁愿有一个界面定义所有可能的键,另一个基本上说这个var的每个键是一个字符串或一个包含2个字符串的数组。
对不起,很长的帖子只是试图彻底和清晰,即使我不确定它是。如果不清楚,请告诉我
谢谢!
答案
当然,您可以使用映射类型,如下所示:
interface LocalDico {
page: string,
of: string,
items: string,
itemsperPage: string
}
type Localisation = { [key in keyof LocalDico]: [string, string] };
或者更清洁一点(在我看来):
// NOTE: an enum would also work here
type LocaleKeys =
| 'page'
| 'of'
| 'items'
| 'itemsperPage'
type LocalDico = { [key in LocaleKeys]: string }
type Localisation = { [key in LocaleKeys]: [string, string] }
以上是关于有没有办法输入一个对象,以便扩展接口的所有属性都是给定的类型?的主要内容,如果未能解决你的问题,请参考以下文章