我有一个嵌套的对象,我想为其编写一个类型定义。这是对象:
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
,打字稿编译器给我这个错误:
Property 'black' does not exist on type 'ColorObject'.
Property 'black' does not exist on type 'string'. TS2339
> 82 | backgroundColor: colors.grayscale.black,
| ^
看来打字稿正在忽略ColorObject
可以是ObjectOf<>
的事实,这意味着任何字符串都应该是有效的键。相反,它认为它只能是字符串,因此获取black
对象的grayscale
键失败。为什么会这样,和/或如何修复类型定义,以便可以按原样使用我的colors对象?
以下内容:
const colors = {
grayscale: {
black: '#141414',
darkGray: '#303030',
white: '#F0F0F0',
},
green1: '#1DB954',
green2: '#1ED760',
} as const
type Colors = typeof colors
我倾向于在有一些具体结构的情况下使用此结构,并希望以此为基础建立牢固的合同。我只能导出类型,并且该应用程序的真实来源将是colors对象。当您添加删除其中的内容时,类型会自动更新。缺点很少,但我相信仍然有用。