Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 嵌套对象类型定义_Typescript - Fatal编程技术网

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在整个项目中都知道它的类型