有没有一种方法可以键入对象,以便扩展接口的所有属性都是给定类型?

时间:2019-03-28 14:48:13

标签: typescript typescript-typings

我正在尝试为我们使用的字典创建类型。我们所做的有些奇怪,但我会尽力解释。我们的应用程序中有一个字典,我们这样声明:

  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个字符串的数组。

很长一段时间以来,很抱歉,尽管我不确定是什么,但它只是试图彻底和清楚。如果不清楚,请告诉我

谢谢!

1 个答案:

答案 0 :(得分: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] }