ChatGPT解决这个技术问题 Extra ChatGPT

如何为具有动态键的对象定义接口?

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

myObject = {
  "key" : [{Object},{Object2},{Object3}],
  "key2" : [{Object4},{Object5},{Object6}],
  ...
}

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

不同的 ObjectX 有类型还是只是 any

B
Bruno Grieder

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

interface Dic {
    [key: string]: Object[]
}

打字稿文献通常将这种模式称为“可索引对象的描述”,具有一般形式

interface Dic {
    [key: string|number]: object_type
}

或者

type Dic = {
    [key: string|number]: object_type
}

错误 TS1023:索引签名参数类型必须是“字符串”或“数字”。
M
Mikael Couzic

现在 TypeScript 中有一个专用的 Record 类型:

const myObject: Record<string, object[]> = { ... }

此外,请考虑尽可能键入键:

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

const myObject: Record<MyKey, object[]> = { ... }

如果导出可以做export type MyType = Record<string, object[]>;
H
Henrique Bruno
{ [x: string]: T }

Record<string, T>

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

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

{ [P in string]: T }

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

export type obj<T = unknown> = Record<string, T>

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

例如:

type MyObjectType = {
  propA: obj; // An object with unknown props
  propB: obj<number>; // An object with number props
}

TS2304:找不到名称“T”。
@AlexeySh。前 3 个示例中的 T 实际上是您希望属性应具有的任何类型。例如string。如果它们可能有任何价值,您可以使用 anyunknown。在 export type obj<T = unknown> = Record<string, T> 示例中,它是一个泛型类型。默认情况下,这里的 T 具有未知类型,但正如最后一个示例所示,您可以专门使用 obj<number> 强制转换它。 T 将是一个数字。随意要求更多解释,我知道 TS 一开始可能会有些混乱。但是当你了解它的力量时,它真的很棒! :)
A
Asutosh

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

let memoTable: { [k: number]: number } = {};
memoTable[1]=5;
memoTable[2]=7;

z
zemil

我建议使用 Map 的解决方案,也许对某人有用:

type TKey = 'key1' | 'key2' | 'key3';
type TValue = object[];

type TMapper = Map<TKey, TValue>; // But also you can use Record instead of Map

K
Kriti

而不是使用 Object 作为类型使用 Record

interface myObjInterface {
  [key: string]: Record<string, any>[]
}