Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.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
Javascript 嵌套对象-接口与记录类型?_Javascript_Typescript - Fatal编程技术网

Javascript 嵌套对象-接口与记录类型?

Javascript 嵌套对象-接口与记录类型?,javascript,typescript,Javascript,Typescript,我有一个长度未知的对象,其中每个项都可以有真/假值,或者有另一个值为真/假的对象。它不能更深(只有两个维度) 我可以用[]方括号创建接口,或者用相同的东西创建接口,但类型不同。我应该使用类型或接口来检查此类对象吗 我也可以在记录中使用记录 它们都是有效的,但有哪一种更“正确”、更常见、更标准的方法可以做到这一点? 也许还有其他更好的方法 interface ItemsInterface { [name: string]: boolean | { [name: string]: boolean

我有一个长度未知的对象,其中每个项都可以有真/假值,或者有另一个值为真/假的对象。它不能更深(只有两个维度)

我可以用[]方括号创建接口,或者用相同的东西创建接口,但类型不同。我应该使用类型或接口来检查此类对象吗

我也可以在记录中使用记录

它们都是有效的,但有哪一种更“正确”、更常见、更标准的方法可以做到这一点? 也许还有其他更好的方法

interface ItemsInterface {
  [name: string]: boolean | { [name: string]: boolean }
}

type ItemsType = {
  [name: string]: boolean | { [name: string]: boolean }
}

type ItemsTypeRecord = Record<string, boolean | Record<string, boolean>>
接口项接口{
[名称:字符串]:布尔|{[名称:字符串]:布尔}
}
类型ItemsType={
[名称:字符串]:布尔|{[名称:字符串]:布尔}
}
类型ItemsTypeRecord=记录

正如y2bd所说,
记录的类型与索引签名相同:

/**
 * Construct a type with a set of properties K of type T
 */
type Record<K extends keyof any, T> = {
    [P in K]: T;
};

最后一个无法编译。我认为这是因为TypeScript允许在条件类型表达式(
T扩展U?V:W
)和对象类型(如
RecType
)中使用递归类型别名。但是,由于
RecTypeRecord
不是直接的对象类型,而是使用
Record
来代替,因此TypeScript无法判断该类型不是无限的。

如果您检查记录类型的源代码,您会发现它的定义与您的
类型
类型完全相同:@y2bd很好,谢谢它们在语义上都是相同的。最后一个对我来说似乎是最可读的,除非你得到比
name
更具描述性的键名。
/**
 * Construct a type with a set of properties K of type T
 */
type Record<K extends keyof any, T> = {
    [P in K]: T;
};
interface RecInterface {
  [name: string]: boolean | RecInterface
}

type RecType = {
  [name: string]: boolean | RecType
}

type RecTypeRecord = Record<string, boolean | RecTypeRecord>
//   ~~~~~~~~~~~~~
// Type alias 'RecTypeRecord' circularly references itself.