Here is a class:
export class Survey {
isCompleted: boolean;
response: {
'devices': string[];
'languages': string[];
'frameworks': string[];
'backend': string[];
};
}
I'm getting the "Element implicitly has an 'any' type because type '...' has no index signature" error when trying the following:
return Object.keys(user1.response).map(key => {
return percentageMatch(user1.response[key], user2.response[key]) * categoryScores[key];
})
user1
and user2
are instances of the Survey
class.
I know how to set an index signature with simple object literals but how do I do it with the properties of the response
object, which is itself a property of the Survey
class.
That required adding an index type [key: string]: string[]
to the response
type:
export class Survey {
isCompleted: boolean;
response: {
[key: string]: string[],
devices: string[],
languages: string[],
frameworks: string[],
backend: string[],
};
}
You can check it out in the TypeScript Playground demo that I created.
You could also consider reducing repetition here and extract known keys to a string literal type:
type ResponseKeys = 'devices' | 'languages' | 'frameworks' | 'backend';
export class Survey {
isCompleted: boolean;
response: {
[key in ResponseKeys]: string[]
};
}
Index signature is required because Object.keys()
loses type information and returns string arrays.
You can introduce your own function which is similar to Object.keys()
but is declared to return an array of actual object keys:
function typedKeys<T>(o: T): (keyof T)[] {
// type cast should be safe because that's what really Object.keys() does
return Object.keys(o) as (keyof T)[];
}
Then, there will be no error in a function that iterates keys of one object and accesses another object, if the objects are of the same type:
export class Survey {
isCompleted: boolean;
response: {
'devices': string[];
'languages': string[];
'frameworks': string[];
'backend': string[];
};
}
function f(user1: Survey, user2: Survey) {
return typedKeys(user1.response).map(key => {
return user1.response[key] == user2.response[key];
})
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With