我有一个这样的对象,它是由下划线的 _.groupBy()
方法创建的。
myObject = {
"key" : [{Object},{Object2},{Object3}],
"key2" : [{Object4},{Object5},{Object6}],
...
}
我如何将其定义为带有 TypeScript 的接口?我不想简单地将它定义为 myObject:Object = { ...
而是有一个自己的类型。
ObjectX
有类型还是只是 any
?
您的对象看起来像 Object
数组的字典
interface Dic {
[key: string]: Object[]
}
打字稿文献通常将这种模式称为“可索引对象的描述”,具有一般形式
interface Dic {
[key: string|number]: object_type
}
或者
type Dic = {
[key: string|number]: object_type
}
现在 TypeScript 中有一个专用的 Record
类型:
const myObject: Record<string, object[]> = { ... }
此外,请考虑尽可能键入键:
type MyKey = 'key1' | 'key2' | ...
const myObject: Record<MyKey, object[]> = { ... }
export type MyType = Record<string, object[]>;
{ [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
}
string
。如果它们可能有任何价值,您可以使用 any
或 unknown
。在 export type obj<T = unknown> = Record<string, T>
示例中,它是一个泛型类型。默认情况下,这里的 T 具有未知类型,但正如最后一个示例所示,您可以专门使用 obj<number>
强制转换它。 T 将是一个数字。随意要求更多解释,我知道 TS 一开始可能会有些混乱。但是当你了解它的力量时,它真的很棒! :)
不了解接口,对于动态对象,我们可以这样:
let memoTable: { [k: number]: number } = {};
memoTable[1]=5;
memoTable[2]=7;
我建议使用 Map 的解决方案,也许对某人有用:
type TKey = 'key1' | 'key2' | 'key3';
type TValue = object[];
type TMapper = Map<TKey, TValue>; // But also you can use Record instead of Map
而不是使用 Object 作为类型使用 Record
interface myObjInterface {
[key: string]: Record<string, any>[]
}