打字稿:定义具有受限可枚举属性的地图对象

时间:2017-06-30 15:43:21

标签: typescript

我想将对象映射值限制为某种类型,并能够枚举其键。

有:

const obj = {
  a: 'a',
  b: 'b'
}

type Obj = typeof obj

const obj2: Obj

obj2输入了ab道具

但是我想限制obj道具只是字符串,我可以做

const obj: {[name: string]: string} = {
  a: 'a',
  b: 'b'
}

type Obj = typeof obj

const obj2: Obj

obj2现在没有任何类型的道具,只有任何索引的字符串属性,但我希望它只有ab道具,但我不想这样做,显式枚举键类型(因为我可能有两个以上的ab道具进行枚举):

const obj: {[name in ('a' | 'b')]: string} = {
  a: 'a',
  b: 'b'
}

type Obj = typeof obj

const obj2: Obj

这可以实现吗? Simplier然后是最后一段代码

1 个答案:

答案 0 :(得分:1)

所以基本上没有。这是不可能的。我看到更合理的解决方案可以根据需要定义限制类型,并在需要时转换为索引器类型:

type Indexer = {[name: string]: string};
type Obj = {a: string, b: string};
obj: Obj = {a: 'a', b: 'b'}

// Lodash map
_.map(<Indexer> obj, (val, key) => {})

注意:

如果您不想使用索引器,因为它们会破坏类型安全性,那么就此问题进行公开讨论issue

如果你没有这个问题,你可以简单地定义你的类型:

type Obj = {a: string, b: string, [name: string]: string}}