typescript - Typdeklaration som tar bort "Array" runt typer utan att förlora namn
Jag arbetar på ett projekt med en vän och vi ville skapa en typ där typen har det första värdet av nyckeln i ett gränssnitt, och om de matchar ska resten matcha parametrarna för den funktion som är associerad.
export default interface ClientToServerEvents {
'authenticate': (token: string) => void;
'update-title': (title: string, annoteId: string) => void;
}
type Partial<T> = { [P in keyof T]: [P, Parameters<T[P]>]; };
type ClientToServerEventsType = ValueOf<Partial<ClientToServerEvents>>;
Detta är vad vi har fått hittills vilket resulterar i en typ som ser ut som:
type ClientToServerEventsType = ["authenticate", string] | ["update-title", string, string]
Detta är nästan vad vi vill ha, men vi skulle vilja att typen behåller namnen på parametrarna också, och inte bara vara sträng. Vad vi vill ha är:
type ClientToServerEventsType = ["authenticate", token: string] | ["update-title", title: string, annoteId: string]
Vi har hållit på i en timme och kan inte hitta något. Tack!
Svar #1
Tuple-element måste alla antingen vara namngivna eller alla inte namngivna. Eftersom din tuple inte har ett namn för det första elementet kommer alla andra namn att tas bort.
Om du namnger det första elementet kommer du att se att namnen bevaras:
type AllParams<T extends Record<keyof T, (...a: any)=> any>> = {
[P in keyof T]: [name: P, ...rest: Parameters<T[P]>];
};
type ClientToServerEventsType = ValueOf<AllParams<ClientToServerEvents>>;
// [name: "authenticate", token: string] | [name: "update-title", title: string, annoteId: string]
Lekplatslänk
