I am creating a simple hook to retrieve option objects by providing the items, labelKey and valueKey.
This is my interface for the hook parameters:
interface IProps<T> {
items: T[];
labelKey: keyof T;
valueKey: keyof T;
}
And this is the hook itself:
const useOptions = <T extends object>(props: IProps<T>) => {
const { items, labelKey, valueKey } = props;
const options = useMemo<SelectOption[]>(() => {
return items.map((item) => ({
label: item[labelKey],
value: item[valueKey],
}));
}, [items]);
return options;
};
export default useOptions;
And finally this is the SelectOption and I am planning to get an array of this type.
export interface SelectOption {
value: number | string;
label: number | string;
}
I am so close but I couldn't find what I'm missing here. This is the typscript error that I see:
Type 'T[string]' is not assignable to type 'string | number'.
CodePudding user response:
Right now T could have any shape. You only constrained T to be an object type. But you are trying to assign values inside T to the properties of SelectOption. Both properties of SelectOption only accept string or number as their values which explains the error.
We could constrain T to also only have number | string properties.
const useOptions = <
T extends Record<string, string | number>
>(props: IProps<T>) => {
/* ... */
};
