my intent here is to write a helper function whose aim is to dynamically sort an array of objects (first argument) in alphabetical order, based on a key passed as second argument.
The function:
interface GenericObject {
[key: string]: string;
}
export const sortAlphabetically = (array: Array<GenericObject>, sortBy: keyof GenericObject) => {
let isKeyValid = false;
// check the key exists in the object before attempting to sort by it
if (array.length > 0) {
isKeyValid = array.every(obj => Object.prototype.hasOwnProperty.call(obj, sortBy) && typeof obj[sortBy] === 'string');
}
if (isKeyValid) {
array.sort((a: GenericObject, b: GenericObject) =>
a[sortBy].toLowerCase() < b[sortBy].toLowerCase()
? -1
: a[sortBy].toLowerCase() > b[sortBy].toLowerCase()
? 1
: 0,
);
return array;
} else {
return;
}
};
So now, even before being able to test my function, if I try to do this:
export interface Person {
name: string;
surname: string;
}
const people: Person[] = [
{name: 'John', surname: 'Smith'},
{name: 'Tony', surname: 'Denver'},
{name: 'Mary', surname: 'Howard'},
]
sortAlphabetically(people, 'name');
or this:
export interface Car {
model: string;
make: string;
}
const cars: Car[] = [
{model: 'Golf', make: 'Volkswagen'},
{model: 'X1', make: 'BMW'},
{model: 'Clio', make: 'Renault'},
]
sortAlphabetically(cars, 'make');
I get the error:
TS2345: Argument of type 'Person[]' is not assignable to parameter of type 'GenericObject[]'. Type 'Person' is not assignable to type 'GenericObject'. Index signature is missing in type 'Person'.
Same happens for Car[].
As a helper function, the key point is that it needs to adapt to any type of object that will be passed inside the array, without complaining about the type.
Therefore I'm quite sure the problem is with the way I'm defining my GenericObject.
Can someone point out what I'm missing here? Thanks a lot.