我有一个嵌套的对象,我想为它写一个类型定义。下面是对象:
const colors = {
grayscale: {
black: '#141414',
darkGray: '#303030',
white: '#F0F0F0',
},
green1: '#1DB954',
green2: '#1ED760',
}下面是我尝试编写类型定义的方法:
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编译器给我这个错误:
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对象?
发布于 2020-01-06 19:18:15
下面是什么呢?
const colors = {
grayscale: {
black: '#141414',
darkGray: '#303030',
white: '#F0F0F0',
},
green1: '#1DB954',
green2: '#1ED760',
} as const
type Colors = typeof colors 我倾向于在我有一些具体结构的地方使用它,我想从它建立一个强大的合同。我只能导出的类型和应用程序的真值来源将是颜色对象。当您在其中添加或删除某些内容时,类型会自动更新。它的缺点很少,但我相信它仍然有用。
https://stackoverflow.com/questions/59572212
复制相似问题