My solution is only a workaround which might help. This is not exactly what you want
Here you have non generic solution.I mean it works only with foo type signature
function foo<T>(bar: T, baz: number) { }
type Fn = (...args: any) => any
type Tail<T extends any[]> = T extends [infer _, ...infer Rest] ? Rest : never
type ReplaceFirstParameter<F extends Fn, Fst> =
(fst: Fst, ...args: Tail<Parameters<F>>) => ReturnType<F>
type Foo<T> = ReplaceFirstParameter<typeof foo, T>
type Result = ReplaceFirstParameter<typeof foo, number> // (fst: number, baz: number) => void
This solution is most more generic. It will replace all unknown params with provided generic argument.
I assume that every function generic is unknown - this is the weak place.
type MapPredicate<T, V> = T extends unknown ? V : T
type ReplaceUnknown<
Arr extends Array<unknown>,
Value,
Result extends Array<unknown> = []
> = Arr extends []
? []
: Arr extends [infer H]
? [...Result, MapPredicate<H, Value>]
: Arr extends [infer Head, ...infer Tail]
? ReplaceUnknown<[...Tail], Value, [...Result, MapPredicate<Head, Value>]>
: Readonly<Result>;
function foo<T>(bar: T, baz: number) { }
type Fn = (...args: any) => any
type ReplaceParameters<F extends Fn, Value> =
(...args: ReplaceUnknown<Parameters<F>, Value>) => ReturnType<F>
type Result = ReplaceParameters<typeof foo, number> // (fst: number, baz: number) => void
Playground