Giao diện cho khóa động trong bảng chữ


82

Tôi có một Đối tượng như thế này được tạo bằng _.groupBy()phương thức gạch dưới .

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

Làm cách nào để xác định đó là Giao diện với TypeScript? tôi không muốn định nghĩa nó đơn giản myObject:Object = { ...mà phải có một kiểu riêng cho nó.


Khác nhau ObjectXcó một loại hay chỉ là chúng any?
— Nitzan Tomer,

Câu trả lời:


197

Đối tượng của bạn trông giống như một từ điển của Objectcác mảng

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

lỗi TS1023: Loại tham số chữ ký chỉ mục phải là 'chuỗi' hoặc 'số'.
— basickarl

46

Bây giờ có một Recordloại chuyên dụng trong TypeScript:

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

Ngoài ra, hãy cân nhắc gõ các phím bất cứ khi nào có thể:

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

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

2
nếu xuất khẩu có thể làmexport type MyType = Record<string, object[]>;
— galki

2

không biết về giao diện, đối với các đối tượng động, chúng ta có thể làm như sau:

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

2

Thay vì sử dụng Đối tượng làm kiểu, hãy sử dụng Bản ghi

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

2
{ [x: string]: T }

và

Record<string, T>

thường sẽ phục vụ cho tất cả các mục tiêu của bạn. Tuy nhiên, tôi có một điểm lạ là sau một số thao tác gõ, tùy chọn đầu tiên trả về cho tôi cả [x: string] và [x: number], và tôi không thể sử dụng Bản ghi, vì nó là một đệ quy hoạt động kiểu và chỉ định kiểu đã gặp lỗi nói rằng kiểu đệ quy của tôi không phải là chung.

Vì vậy, khi nghiên cứu mã Record thực sự nhỏ, tôi đã tìm ra giải pháp này để giải quyết vấn đề phức tạp của mình:

{ [P in string]: T }

Chỉnh sửa: Tôi cũng thường có điều này trong mọi mã Typecript tôi viết, trong tệp utils.ts:

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

Nhanh hơn và sạch hơn so với việc sử dụng Record mọi lúc.

Ví dụ:

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

0

Tôi sẽ đề xuất một giải pháp với Bản đồ, có thể đối với ai đó nó sẽ hữu ích:

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

type TMapper = Map<TKey, TValue>; // But also you can use Record instead of Map
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.