Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.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中用作映射的JavaScript对象_Javascript_Typescript - Fatal编程技术网

如何正确键入在TypeScript中用作映射的JavaScript对象

如何正确键入在TypeScript中用作映射的JavaScript对象,javascript,typescript,Javascript,Typescript,我有一个JavaScript对象,其结构如下: { "_index": 1, "foo": { ... }, "bar": { ... }, "baz": { ... }, } 也就是说,对象将始终具有一个带有数字值的属性\u index,然后所有其他键(自用作贴图以来未定义)具有另一个特定对象的值 我在TypeScript中尝试了以下类型 type Properties = { _index: number } type Fields = { // its not

我有一个JavaScript对象,其结构如下:

{
  "_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
来避免这个问题,但这会使处理对象变得更困难。更新了答案。你是对的,我点错菜了。