javascript - Hur man återanvänder en funktionssignatur för flera funktioner med TypeScript


Överväg följande kod:

type TCallBack = () => void

const subscriptions: { [key: string]: TCallBack[] } = {}

interface ISubscription {
  eventName: string
  callback: TCallBack
}

export function unsubscribe({ eventName, callback }: ISubscription) {
  // ...
}

export function subscribe({ eventName, callback }: ISubscription) {
  // ...
}

export function subscribeOnce({ eventName, callback }: ISubscription) {
  // ...
}

Funktionssignaturen { eventName, callback }: ISubscription används för flera funktioner. Finns det ett sätt att undvika att behöva kopiera denna signatur men återanvända den? Jag tänkte att något liknande nedan skulle vara bra:

const functionSignature = { eventName, callback }: ISubscription
export function subscribe(functionSignature ) {

Men detta fungerar förstås inte. Tack för din hjälp.

Svar #1

Du kan definiera en typ som bestämmer dina indata parametrar och returtyp och sedan bara skriva implementationen så här:

type TCallBack = () => void

const subscriptions: { [key: string]: TCallBack[] } = {}

interface ISubscription {
  eventName: string
  callback: TCallBack
}

type FunctionType = (subscription: ISubscription) => void

export const unsubscribe: FunctionType = ({ eventName, callback }) => {

}

export const subscribe: FunctionType = ({ eventName, callback }) => {

}

export const subscribeOnce: FunctionType = ({ eventName, callback }) => {

}

Men som nämnts i kommentarerna är detta inte ett särskilt bra tillvägagångssätt eftersom det inte ger dig mycket nytta, utan snarare orsakar problem i vissa refaktorering-scenarier.

Svar #2

Ja, du kan definiera en typ för din funktion på detta sätt:

type EventCallBack = () => void

export type SubscribeFunction = (subscription: Subscription) => void

export interface Subscription {
  eventName: string
  callback: EventCallBack
}


export const unsubscribe: SubscribeFunction = ({ eventName, callback }) => {}

...

Om du går den här vägen föreslår jag att:

  • Exportera både SubscribeFunction och Subscription-typerna, så att en användare av din modul kan referera korrekt till typerna
  • Använd mer meningsfulla, domänorienterade namn för dina typer, som bättre återspeglar deras syfte; jag använde EventCallback istället för TCallback och tog bort det onödiga I-prefixet från ditt gränssnitt.

Relaterade artiklar