首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套对象类型定义

嵌套对象类型定义
EN

Stack Overflow用户
提问于 2020-01-03 09:37:41
回答 1查看 946关注 0票数 0

我有一个嵌套的对象,我想为它写一个类型定义。下面是对象:

代码语言:javascript
复制
const colors = {
  grayscale: {
    black: '#141414',
    darkGray: '#303030',
    white: '#F0F0F0',
  },
  green1: '#1DB954',
  green2: '#1ED760',
}

下面是我尝试编写类型定义的方法:

代码语言:javascript
复制
interface ObjectOf<V> {
  [_: string]: V
}

type ColorObject = ObjectOf<string> | string
type Colors = ObjectOf<ColorObject>

const colors: Colors = {
  ... (same object as above)
}

我使用ObjectOf<V>来拥有一个对象,该对象可以有任何字符串类型的键,但只能有V类型的值。这似乎适用于未嵌套的对象。

当我尝试像这样使用这个对象时:colors.grayscale.black,typescript编译器给我这个错误:

代码语言:javascript
复制
Property 'black' does not exist on type 'ColorObject'.
  Property 'black' does not exist on type 'string'.  TS2339

  > 82 |     backgroundColor: colors.grayscale.black,
       |                                       ^

似乎typescript忽略了一个事实,即ColorObject可以是一个ObjectOf<>,这意味着任何字符串都应该是一个有效的键。相反,它认为它只能是一个字符串,因此获取grayscale对象的black键失败。为什么会这样,和/或我如何修复类型定义,以便可以按原样使用我的colors对象?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-06 19:18:15

下面是什么呢?

代码语言:javascript
复制
const colors = { 
  grayscale: { 
    black: '#141414', 
    darkGray: '#303030', 
    white: '#F0F0F0', 
  }, 
  green1: '#1DB954', 
  green2: '#1ED760', 
} as const 

type Colors = typeof colors 

我倾向于在我有一些具体结构的地方使用它,我想从它建立一个强大的合同。我只能导出的类型和应用程序的真值来源将是颜色对象。当您在其中添加或删除某些内容时,类型会自动更新。它的缺点很少,但我相信它仍然有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59572212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档