Typescript 嵌套对象类型定义
我有一个嵌套对象,我想为它编写一个类型定义。以下是对象:Typescript 嵌套对象类型定义,typescript,Typescript,我有一个嵌套对象,我想为它编写一个类型定义。以下是对象: const colors={ 灰度:{ 黑色:“#141414”, 暗灰色:“#303030”, 白色:“#f0”, }, 绿色1:“#1DB954”, 绿色2:“#1ED760”, } 下面是我如何尝试编写类型定义的: 对象的接口{ [[uuux:string]:V } 类型ColorObject=ObjectOf | string 类型Colors=ObjectOf 常量颜色:颜色={ …(与上述对象相同) } 我使用Object
const colors={
灰度:{
黑色:“#141414”,
暗灰色:“#303030”,
白色:“#f0”,
},
绿色1:“#1DB954”,
绿色2:“#1ED760”,
}
下面是我如何尝试编写类型定义的:
对象的接口{
[[uuux:string]:V
}
类型ColorObject=ObjectOf | string
类型Colors=ObjectOf
常量颜色:颜色={
…(与上述对象相同)
}
我使用ObjectOf
来创建一个对象,该对象可以有任何字符串键,但只能有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
键失败。为什么会这样,和/或如何修复类型定义,以便可以按原样使用颜色对象?以下内容如何:
const colors = {
grayscale: {
black: '#141414',
darkGray: '#303030',
white: '#F0F0F0',
},
green1: '#1DB954',
green2: '#1ED760',
} as const
type Colors = typeof colors
我倾向于在我有一些具体结构的地方使用它,我想从中建立一个强大的合同。我只能导出类型,应用程序上的真实来源将是颜色对象。添加或删除其中的内容时,类型会自动更新。虽然有一些缺点,但我相信还是有用的。它可以成为的
对象,这一点不容忽视。它担心它可能是一个字符串
,在这种情况下,它将没有名为black
的属性。您只能访问联合中所有成员中存在的联合的属性。或者您必须通过测试来消除联盟成员,例如if(typeof colors.grayscale==“string”)抛出新错误()编码>然后访问颜色、灰度、黑色
。为什么要将颜色
注释为颜色
?这是一种相当广泛的类型,故意忘记了颜色的结构。你的用例是什么?我明白了,这是有道理的。我的用例是在React组件中使用colors对象和另一个类似的对象作为样式。当我对只能接受某些字符串(如flexDirection)的属性使用“row”等字符串时,Typescript给了我错误,即使“row”是这些有效值之一。我想我会指定所有这些对象的类型来避免这种情况,但我想这不是最好的解决方案。我去掉了颜色的类型定义,我可能会就我遇到的实际问题提出一个不同的问题(现在我使用类型转换来安抚编译器,但idk如果这是最好的解决方案)。谢谢你的指导!那么下面的内容呢:ts const colors={grayscale:{black:''#141414',darkGray:''#303030',white:''#F0F0F0',},green1:'#1DB954',green2:''#1ED760',}作为const type colors=颜色类型
我倾向于在有一些具体结构的地方使用它,我想从中建立一个强大的契约。我只能导出类型,应用程序上的真实来源将是颜色
对象。添加或删除其中的内容时,类型会自动更新。虽然有一些缺点,但我相信仍然有用。@rusev谢谢你,这正是我需要的!您是否愿意将此作为答复提交,以便我可以接受?如果没有,我会将其作为我自己的答案发布,以便其他人可以看到。我非常确定我不需要type Colors=typeof Colors
,因为我导出Colors
,typescript在整个项目中都知道它的类型