async function fn(): Promise<symbol>
async function fn(p: string): Promise<number>
async function fn(p: number): Promise<string>
async function fn(p?: string | number) {
switch (typeof p) {
case 'string':
return Number(p)
case 'number':
return String(p)
default:
return Symbol()
}
}
fn() // Promise<symbol>
fn(1) // Promise<string>
fn('1') // Promise<number>
const wrap = oi(fn)
wrap.init() // Expected 1 arguments, but got 0.
wrap.init(1) // Promise<string>
wrap.init('1') // Argument of type 'string' is not assignable to parameter of type 'number'.ts(2345)