typescript - Type-nivå operasjoner for merkede tuple
Jeg vil gjerne gjøre noe lignende som under med merkede tupler og lurer på om dette er mulig i TS4 ennå
type stringProperties<T extends {}> = {[k in keyof T]: string}
Dette ville bety at jeg kunne lage en type [foo: string, bar: string, baz: string] fra [foo: boolean, bar: number, baz: any]
Akkurat nå mangler jeg måten å generelt fange opp etiketten på (den er ikke til stede i keyof) og er ikke sikker på hvordan jeg legger til et annet label:type-par til en eksisterende tuppeltype.
Jeg er klar over teknikken nedenfor for å forhåndsette til en umerket tuppel, men i dette tilfellet vil etiketten bli satt som first.
export type Prepend<E, T extends any[]> =
((first: E, ...args: T) => any) extends ((...args: infer U) => any)
? U
: never
Svar #1
Du kan bruke kartlagte tuple-typer for å bare endre elementtypene. Deres etiketter beholdes:
type T1 = stringProperties<[foo: boolean, bar: number, baz: any]>
// [foo: string, bar: string, baz: string]
Selv om du ikke kan hente ut funksjonsparameternavnene direkte, er det fortsatt mulig å legge til et nytt merket element med TS 4.0 variadiske tuppeltyper:
type Prepend<E extends [unknown], A extends any[]> = [...E, ...A]
type Append<E extends [unknown], A extends any[]> = [...A, ...E]
// ... extend to your needs
type T2 = Prepend<[customLabel: string], A>
// [customLabel: string, foo: boolean, bar: number, baz: any]
type T3 = Append<[customLabel: string], A>
// [foo: boolean, bar: number, baz: any, customLabel: string]
type T4 = Prepend<[customLabel: string], stringProperties<A>> // or mix it up
// [customLabel: string, foo: string, bar: string, baz: string]
function foo(...args: T4) {}
// function foo(customLabel: string, foo: string, bar: string, baz: string): void
Lekeplass
