typescript - Dinamik anahtarlara sahip nesneler için bir arayüz nasıl tanımlanır?
Underscore'un _.groupBy() yöntemiyle oluşturulmuş böyle bir nesnem var.
myObject = {
"key" : [{Object},{Object2},{Object3}],
"key2" : [{Object4},{Object5},{Object6}],
...
}
Bunu TypeScript ile bir Arayüz (Interface) olarak nasıl tanımlardım? Bunu basitçe myObject:Object={ ... olarak tanımlamak istemiyorum, bunun yerine bunu kendine ait bir tipi olsun istiyorum.
Cevap #1
Nesneniz Object dizilerinin bir sözlüğü gibi görünüyor
interface Dic {
[key: string]: Object[]
}
Typescript literatürü bu deseni genellikle genel bir form ile "indekslenebilir bir nesnenin tanımı" olarak adlandırır
interface Dic {
[key: string|number]: object_type
}
veya
type Dic = {
[key: string|number]: object_type
}
Cevap #2
TypeScript'te artık özel bir Record türü var:
const myObject: Record<string, object[]> = { ... }
Ayrıca, mümkün olduğunda tuşlara basmayı düşünün:
type MyKey = 'key1' | 'key2' | ...
const myObject: Record<MyKey, object[]> = { ... }
Cevap #3
{ [x: string]: T }
ve
Record<string, T>
genellikle tüm amaçlarınız için hizmet edecektir. Ancak, bazı tür işlemlerinden sonra ilk seçeneğin bana hem [x: string] hem de [x: number] döndürdüğü garip bir noktaya geldim ve Record'u kullanamıyordum, çünkü bu bir özyinelemeli tür işlemiydi ve Typescript özyinelemeli türemin generik olmadığını belirten bir hata veriyordu.
Yani, gerçekten küçük Record kodunu inceleyerek, karmaşık problemimi çözen bu çözüme ulaştım:
{ [P in string]: T }
Düzenle: Bunu genellikle yazdığım her Typescript kodunda, bir utils.ts dosyasında bulundururum:
export type obj<T = unknown> = Record<string, T>
Her zaman Kaydı kullanmaktan daha hızlı ve daha temiz.
Örneğin:
type MyObjectType = {
propA: obj; // An object with unknown props
propB: obj<number>; // An object with number props
}
