有没有办法输入一个对象,以便扩展接口的所有属性都是给定的类型?

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] }

以上是关于有没有办法输入一个对象,以便扩展接口的所有属性都是给定的类型?的主要内容,如果未能解决你的问题,请参考以下文章

Django 模板:有没有办法根据其属性查询特定对象(而不是遍历所有对象)?

DOM

J1003.JavaFX属性和绑定01——简单对象

有没有办法在python中访问另一个对象的属性?

如何为所有控制器方法返回公共/通用响应对象?

“A型与B型没有共同特性”是什么意思?