Wzorce
Jak zachować zależność między każdym kluczem i jego wartością podczas iteracji po `Object.entries`?
Zbuduj unię krotek klucz/wartość przez typ mapowany i zamknij nieuniknioną asercję w jednym pomocniku.
Przepis
type Entry<T extends object> = { [K in keyof T]-?: readonly [K, T[K]] }[keyof T] function typedEntries<T extends object>(value: T): Entry<T>[] { return Object.keys(value).map(key => [key, value[key as keyof T]] as unknown as Entry<T> ) } const settings = { dark: true, retries: 3 } const entries = typedEntries(settings)
Build to kompiluje i sprawdza każdy wynik poniżej.
Jak to działa
- 01
readonly [K, T[K]]Każda mapowana właściwość staje się krotką, której wartość jest związana z dokładnie tym kluczem.
- 02
}[keyof T]Indeksowanie zwija tabelę do dyskryminowanej unii par.
Co dostajesz
readonly ['a', 1] extends Entry<{ a: 1; b: 'x' }> ? true : false
→truereadonly ['b', 'x'] extends Entry<{ a: 1; b: 'x' }> ? true : false
→truereadonly ['a', 'wrong'] extends Entry<{ a: 1; b: 'x' }> ? true : false
→false
Gdzie to zawodzi
Tak jak przy typowanych kluczach, asercja zakłada brak dodatkowych właściwości poza `keyof T`. Używaj jej dla obiektów należących do twojego kodu, nie dla niesprawdzonych wartości z API lub JSON.
Wniosek
Mapowany obiekt zindeksowany przez `keyof` to precyzyjny sposób budowania skorelowanej unii krotek.
