Korrekt sätt att hantera en Partial Record med iteration som inte visar undefined i TypeScript?


Jag försöker hitta rätt sätt att skriva ett logiskt Dictionary-objekt i TypeScript. Record och Partial-typerna tillsammans fungerar inte på det sätt jag vill -- mitt "önskemål" är att det ska bete sig som en vanlig ordbok/karta som finns i andra språk.

Givet en dict: Dictionary<K,V> vill jag:

  • dict.key att ha typen undefined|V eftersom nyckeln kanske inte finns
  • Object.values(dict) för att ha typen Iterable<V>
  • Object.entries(dict) för att ha typen Iterable<[K, V]>
  • Object.keys(dict) för att ha typen Iterable<K>

Record<K,V> fungerar inte, eftersom åtkomst via nyckel alltid ger värdetypen V, även om nyckeln kanske inte finns.

Partial<Record<K,V>> fungerar inte, eftersom Object.values då returnerar en typ av Iterable<V|undefined>

Hur kan jag korrekt definiera en Dictionary-typ som fungerar med standard JS-objekt?

Det är okej om jag måste åsidosätta definitionerna av Object.values/entries/keys för en Dictionary-typ. Jag är inte säker på hur jag åsidosätter Object-funktioner endast för specifika typer.

Observera: Jag är medveten om mycket av historien kring dessa typer här. Jag är intresserad av att hitta en lösning som fungerar. Ovanstående Dictionary är ett vanligt typningsparadigm som finns i många språk, så jag skulle vilja att det är möjligt i TypeScript.

Svar #1

För tillfället verkar det inte finnas något sätt att korrekt modellera en Dictionary-typ i TypeScript.

En fråga om TypeScript-projektet anger noUncheckedIndexedAccess som ett alternativ, men det är en global flagga som går bortom poster och markerar även viss giltig användning av arrayer.