I have type Item
: type Item = 'itemA' | 'itemB' | 'itemC' | 'itemD';
I have 2 types of items – QuantityBasedItem
and BooleanBasedItem
:
I have a function that get an item and if the item type is QuantityBasedItem
, it also get the quantity:
type MyType<T extends Item> = {
name: T;
requirements: T extends QuantityBasedItem ? { units: number } : undefined;
};
function test<T extends Item>(itemData: MyType<T>){
getItemData(itemData)
}
First issue:
test({name: 'itemB', requirements: undefined}); // works OK
test({name: 'itemB'}); // ERROR. i don't want to have to send unnecessary data (undefined) `test({item: 'itemB', requirements: undefined})`
Second issue:
const getIsQuantityBasedItem = (x: Item): x is QuantityBasedItem => x === 'itemA';
export const getItemData = <T extends Item>(
itemData: MyType<T>,
) => {
if(getIsQuantityBasedItem(itemData.name)){
// ISSUE 2: ERROR: the type is not inferred. the item is quantity based => item.requirements is exist and has units inside it, but typescript does't infer it
return getQuantityBasedItemData(itemData.name, itemData.requirements.units)
} else {
return getBooleanBasedItemData(itemData.name)
}
};
const getBooleanBasedItemData = (item: BooleanBasedItem) => (item);
const getQuantityBasedItemData = (item: QuantityBasedItem, units: number) => ({item, units});
playground