typescript - Union-Type blir til Intersection-Type
Problem
Jeg vil lage en fabrikk som leverer forskjellige funksjoner avhengig av de gitte parameterne. Dette kan løses med betingede typer.
type DispatchConditional<TPayload> = TPayload extends undefined
? () => void
: (payload: TPayload) => void;
Typen DispatchCondition kan instrumenteres av et grensesnitt.
interface ActionDispatcher<TPayload> {
dispatch: DispatchConditional<TPayload>;
}
Hvis jeg bygger en fabrikk basert på definisjonene ovenfor, vil den bryte hvis en Union-Type brukes. På en eller annen måte blir union-typen definert av payloadUnion() til en Intersection-Type.
Spørsmål
Hvilke justeringer må jeg gjøre for å lage en typedefinisjon for metoden dispatch som støtter unionstyper?
Lekeplass
- TypeScript-lekeplass
Svar #1
DispatchConditional er en distribuert betinget type. Dette betyr at DispatchConditional<number | number[]> er ekvivalent med DispatchConditional<number> | DispatchConditional<number[]>, som igjen vil være en union av funksjoner. Og en union av funksjoner kan bare kalles med et snitt av parametertypen (siden vi ikke vet hvilken funksjon vi faktisk får ved kjøring, må vi gi parametere som fungerer med BEGGE funksjonssignaturene, noe som resulterer i snittet)
Den enkle løsningen er å deaktivere den distribuerende oppførselen ved å pakke typeparameteren inn i en tuple-type (distribusjon skjer bare over nakne typeparametere):
type DispatchConditional<TPayload> = [TPayload] extends [undefined]
? () => void
: (payload: TPayload) => void;
Lekeromlenke
