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
SubscribeFunctionochSubscription-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
EventCallbackistället förTCallbackoch tog bort det onödiga I-prefixet från ditt gränssnitt.
