I got an object with specific key/value parameters and I want to iterate over it with entries() method of Object followed by a forEach() method of Array. However I do not understand how I have to type this configuration to avoiding a typescript error:
type objType = {
prop1: number | undefined;
prop2: number | undefined;
prop3: number | undefined;
};
const obj: objType = {
prop1: 2,
prop2: 0,
prop3: undefined,
};
//1st attempt
Object.entries(obj).forEach(([key, value]) => {
if (value === undefined || value < 5) obj[key] = 5;
});
//2nd attempt
Object.entries(obj).forEach(
([key, value]: [keyof objType, number | undefined]) => {
if (value === undefined || value < 5) obj[key] = 5;
}
);
In first attempt, I let typescript infer the type of key (→ string) and value (→ number|undefined). But in this case I got an error when doing obj[key] :
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'objType'. No index signature with a parameter of type 'string' was found on type 'objType'.
In second attempt I forced the type of key to correspond to the key of obj using keyof operator, but this type definition is not allowed and I got the following message :
Argument of type '([key, value]: [keyof objType, number | undefined]) => void' is not assignable to parameter of type '(value: [string, number | undefined], index: number, array: [string, number | undefined][]) => void'. Types of parameters '__0' and 'value' are incompatible. Type '[string, number | undefined]' is not assignable to type '[keyof objType, number | undefined]'. Type at position 0 in source is not compatible with type at position 0 in target. Type 'string' is not assignable to type 'keyof objType'.
I understand the failure for first attempt but not for the second. Why TS believes that I want to assign string to the string enumeration, I'm guessing to do the opposite...?
How is the correct way to type this configuration ?
