javascript - Hvordan skrive typescript typeguard-metode for funksjonstype


export const isFunction = (obj: unknown): obj is Function => obj instanceof Function;
export const isString = (obj: unknown): obj is string => Object.prototype.toString.call(obj) === "[object String]";

Jeg vil skrive en isFunction-metode - lik isString, men TypeScript/ESLint gir meg en feil:

Don't use `Function` as a type. The `Function` type accepts any function-like value.
It provides no type safety when calling the function, which can be a common source of bugs.
It also accepts things like class declarations, which will throw at runtime as they will not be called with `new`.
If you are expecting the function to accept certain arguments, you should explicitly define the function shape  @typescript-eslint/ban-types

Er det noen måte å gjøre dette på?

P.S. Her er svaret:

export const isFunction = (obj: unknown): obj is (...args: any[]) => any => obj instanceof Function;

Svar #1

Vel, advarselen er klar... Du kan oppdage at du har en funksjon, men du kan ikke utlede mye om parametere/aritmetikk/returtype. Den informasjonen er rett og slett ikke tilgjengelig ved kjøring. Den sier at du ikke kan være sikker på hvordan du skal kalle funksjonen, eller hva den returnerer (ved byggetid).

Hvis det er en risiko du føler deg trygg på, deaktiver advarselen.

// tslint:disable-next-line: ban-types på linjen over.

Alternativt kan typen (...args:any[]) => any være en god erstatning for Function, men en funksjon av denne typen er ikke mer typesikker enn før.

Svar #2

Du bør bruke grensesnittet CallableFunction, og lage typevaktfunksjonene dine slik:

export const isFunction = (obj: unknown): obj is CallableFunction => obj instanceof Function;

På denne måten er typen til funksjonen din atskilt fra konstruktørtypene (som kunne vært typet med typen NewableFunction).

Relaterte artikler