Given https://www.typescriptlang.org/play/?#code/C4TwDgpgBAKhDOwoF4oAo0QG7AFxQHIBjAewDsAzASwCcBbCAEwIBooBDGgc3gH0AGfAG8oJLBBoB3GlWAR8AIxIkANhHZkoAXwCUKAHxQsJKoz0AydJhz5iGohDXM9yQ8dM6A3AChvoSFAAogAewDTsRMAAgtwAPDBsgYaoMFAQoRBkjPDo2HhBbJw8+FSUElAACi5uJoxQAPyVUPhk2BI+-tAhYRHAAMLk1PRMMTzxybBpGVk51vnEg7QMzIXcJWU0UACq1Ua1DdvNUK3iND5+4F3iZMAVnOwMcjTw8YkTqelyM7k2UKUU5RggTYADowUV4OsAZtRvBdu46o00ECpl9skEDrCjicJHoWm0zr4APRE44kJCSEg0ADWpS4FwCA0oSyYd3CjwkOVQgWut3uHOe8QQwDYC2Zw2Y+gA2vwALrnEnsFTwEhkilU2lkemdJrc0LhSKjIWIUWkcXLAj6c46qJkckACwkMBoIBQQX1vSZQ2WsONwCtQA
I’m basically trying to extract/infer type of argument when one of intersecting functions have first argument value of “something”.
Consider this Vue example:
type Test = ((evt: 'confirmed', args_0: { overwrite: boolean }) => void) & ((evt: 'canceled') => void);
type ExtractArg<T, E> = T extends (evt: E, args: infer P) => void ? P : never;
type ExtractConfirmedArgs<T> = T extends (evt: 'confirmed', arg: infer U) => void ? U : never;
type EventParameters<T, E> = T extends (evt: infer TE, ...args: infer Args) => void ? (TE extends E ? Args : never) : never;
// not working
type ConfirmedParameters = EventParameters<Test, 'confirmed'>[0];
//also not working
type P = ExtractArg<Test, 'confirmed'>;
type AnotherTry = ExtractConfirmedArgs<Test>;
I’d want to extract the type so type ConfirmedArgs = { overwrite: boolean }
from type Test
, but I couldn’t find if it is possible and AI was also not really helpful, though I would think that code above should work.
Is there something I’m doing wrong here or is it impossible to extract such thing from intersection and only possible to do it with unions ?
Typescript version is 5.4.5.
The closest answer I could find is Typesciprt Dynamic function arguments with GENERICS, but I’m not convinced if it’s the same case here.
Cheers