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.