打字稿中动态键的界面

Man*_*ler 39 typescript

我有一个这样的Object,它是由下划线的_.groupBy()方法创建的.

myObject = {
  "key" : [{Object},{Object2},{Object3}],
  "key2" : [{Object4},{Object5},{Object6}],
  ...
}
Run Code Online (Sandbox Code Playgroud)

我如何将其定义为TypeScript的接口?我不想简单地将其定义为myObject:Object = { ...,而是拥有自己的类型.

Bru*_*der 94

您的对象看起来像Object数组字典

interface Dic {
    [key: string]: Object[]
}
Run Code Online (Sandbox Code Playgroud)

  • 错误 TS1023:索引签名参数类型必须是“字符串”或“数字”。 (2认同)

Mik*_*zic 26

现在RecordTypeScript中有一个专用类型:

const myObject: Record<string, object[]> = { ... }
Run Code Online (Sandbox Code Playgroud)

另外,请考虑尽可能键入密钥:

type MyKey = 'key1' | 'key2' | ...

const myObject: Record<MyKey, object[]> = { ... }
Run Code Online (Sandbox Code Playgroud)

  • 如果导出可以做`export type MyType = Record&lt;string, object[]&gt;;` (5认同)

Asu*_*osh 7

不知道接口,对于动态对象我们可以这样:

let memoTable: { [k: number]: number } = {};
memoTable[1]=5;
memoTable[2]=7;
Run Code Online (Sandbox Code Playgroud)


Hen*_*uno 6

{ [x: string]: T }
Run Code Online (Sandbox Code Playgroud)

Record<string, T>
Run Code Online (Sandbox Code Playgroud)

通常会为您的所有目标服务。然而,我遇到了一个奇怪的问题,在一些类型操作之后,第一个选项同时返回给我 [x: string] 和 [x: number],我无法使用 Record,因为它是一个递归type 操作和 Typescript 抛出一个错误,说我的递归类型不是通用的。

因此,通过研究非常小的 Record 代码,我找到了解决我复杂问题的解决方案:

{ [P in string]: T }
Run Code Online (Sandbox Code Playgroud)

编辑:我通常在我编写的每个 Typescript 代码中都有这个,在 utils.ts 文件中:

export type obj<T = unknown> = Record<string, T>
Run Code Online (Sandbox Code Playgroud)

比一直使用 Record 更快、更干净。

例如:

type MyObjectType = {
  propA: obj; // An object with unknown props
  propB: obj<number>; // An object with number props
}
Run Code Online (Sandbox Code Playgroud)