export type Name = { name: string }
export type Id = { id: number }
export type Value = T extends string ? Name : Id
export function create
Here is another solution which works great as well.
I like this solution better than the accepted answer because you will get correct type deduction when coding:
You can see when hovering, it correctly deduced the type.
Here is the code from the screenshot:
export type Name = { name: string }
export type Id = { id: number }
export type Value = T extends string ? Name : Id
export function create(value: T): Value {
if (typeof value === 'string') return { name: value } as unknown as Value
return { id: value } as unknown as Value
}