如何正确键入在TypeScript中用作映射的JavaScript对象
我有一个JavaScript对象,其结构如下:如何正确键入在TypeScript中用作映射的JavaScript对象,javascript,typescript,Javascript,Typescript,我有一个JavaScript对象,其结构如下: { "_index": 1, "foo": { ... }, "bar": { ... }, "baz": { ... }, } 也就是说,对象将始终具有一个带有数字值的属性\u index,然后所有其他键(自用作贴图以来未定义)具有另一个特定对象的值 我在TypeScript中尝试了以下类型 type Properties = { _index: number } type Fields = { // its not
{
"_index": 1,
"foo": { ... },
"bar": { ... },
"baz": { ... },
}
也就是说,对象将始终具有一个带有数字值的属性\u index
,然后所有其他键(自用作贴图以来未定义)具有另一个特定对象的值
我在TypeScript中尝试了以下类型
type Properties = {
_index: number
}
type Fields = {
// its not important what Metadata is, just that it has a type that isn't number
[field: string]: Metadata
}
type Lookup = Properties & Fields
这对于在TypeScript中访问已经创建的Lookup
实例非常有效,但我似乎无法在TypeScript中创建Lookup
实例
例如,如果我这样做:
let lookup: Lookup = {
_index: 1,
foo: { ... }
}
我得到以下错误:
2322[QF available]: Type '{ _index: number; "foo": { ... }' is not assignable to type 'Lookup'. Type '{ _index: number; "foo": { ... }' is not assignable to type 'Fields'. Property '_index' is incompatible with index signature. Type 'number' is not assignable to type 'Metadata'
在TypeScript中表达此类型的最佳方式是什么?不幸的是,TypeScript不允许您直接创建此类对象。虽然类型系统允许您创建这样的类型,但它有点不一致,因为
查找['''u index']
实际上并不符合索引签名,该签名应始终返回元数据
创建此类对象的最简单方法是使用object.assign
let lookup: Lookup = Object.assign({ _index: 1 }, {
x: {}
})
只需像这样合并您的定义:
type Lookup={[field:string]:元数据,\u index:number}
这将定义一个带有索引的接口查找,然后使用类型元数据定义任何其他属性。使用对象。分配,使类型Foo=Bar&Baz
,创建一个Bar
,创建一个Baz
然后将它们合并在一起,得到一个不起作用的Foo
,对吗?“number”类型的属性“\u index”不可分配给字符串索引类型“Metadata”
。您可以通过将\u index
设为number
或Metadata
来避免这个问题,但这会使处理对象变得更困难。更新了答案。你是对的,我点错菜了。