Konvertera Record till Map på ett typ-säkert sätt - TypeScript
Det här är min funktion som konverterar post till karta:
type MyReturn<Str> = Map<Str, Map<number, number>>;
export const mapRecordToMap = <MyString extends string>(data: Record<MyString, [number, number][]>)
: MyReturn<MyString> => {
const myReturn = new Map<MyString, Map<number, number>>();
Object.entries(data).forEach(([key, value]) => {
myReturn.set(key as MyString, new Map(value as [number, number][]));
});
return myReturn;
};
Problemet jag har är att jag måste använda 'as' här:
myReturn.set(key as MyString, new Map(value as [number, number][]));
att ha korrekt typkontroll. Hur undviker man det?
Tack!
Svar #1
Du kan använda en extra hjälpare för att skriva Object.entries:
type Entries<T> = {
[K in keyof T]: [K, T[K]];
}[keyof T][];
const entries = <Obj,>(obj: Obj) => Object.entries(obj) as Entries<Obj>
export const mapRecordToMap = <MyString extends string>(
data: Record<MyString, [number, number][]>) =>
entries(data).reduce((acc, [key, value]) => {
acc.set(key, new Map(value));
return acc
}, new Map<MyString, Map<number, number>>());
Lekplats
Här kan du hitta fler sätt att skriva Object.entries
P.S. Om du har en deal med [].map, [].reduce, {}.keys, {}.entries och du vill ha en smal returtyp behöver du nästan alltid använda as typförsäkran. Detta är det minsta onda :D
Svar #2
Du behöver bara lägga till ett typargument till Object.entries:
type MyReturn<Str> = Map<Str, Map<number, number>>;
export const mapRecordToMap = <MyString extends string>(data: Record<MyString, [number, number][]>)
: MyReturn<MyString> => {
const myReturn = new Map<MyString, Map<number, number>>();
Object.entries<[number, number][]>(data).forEach(([key, value]) => {
myReturn.set(key as MyString, new Map(value));
});
return myReturn;
};
Detta kan vara snyggare men i praktiken är det inte mycket annorlunda än vad du redan gjorde ... Verkligen, din casting är ganska säker, eftersom om typen inte matchar argumentet så ger det ett fel. (Ett tecken på osäker casting är när du måste göra något mer som as unknown as [number, number][] ...)
