Per coloro che sono interessati allo stile funzionale o cercano un approccio più espressivo da utilizzare nella meta-programmazione (come il controllo del tipo), potrebbe essere interessante vedere Ramda libreria per svolgere tale compito.
Il codice successivo contiene solo funzioni pure e inutili:
const R = require('ramda');
const isPrototypeEquals = R.pipe(Object.getPrototypeOf, R.equals);
const equalsSyncFunction = isPrototypeEquals(() => {});
const isSyncFunction = R.pipe(Object.getPrototypeOf, equalsSyncFunction);
A partire da ES2017, le async
funzioni sono disponibili, quindi possiamo anche verificarle:
const equalsAsyncFunction = isPrototypeEquals(async () => {});
const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);
E poi combinali insieme:
const isFunction = R.either(isSyncFunction, isAsyncFunction);
Naturalmente, la funzione deve essere protetta contro null
e undefined
valori, quindi per renderla "sicura":
const safeIsFunction = R.unless(R.isNil, isFunction);
E, completare lo snippet per riassumere:
const R = require('ramda');
const isPrototypeEquals = R.pipe(Object.getPrototypeOf, R.equals);
const equalsSyncFunction = isPrototypeEquals(() => {});
const equalsAsyncFunction = isPrototypeEquals(async () => {});
const isSyncFunction = R.pipe(Object.getPrototypeOf, equalsSyncFunction);
const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);
const isFunction = R.either(isSyncFunction, isAsyncFunction);
const safeIsFunction = R.unless(R.isNil, isFunction);
// ---
console.log(safeIsFunction( function () {} ));
console.log(safeIsFunction( () => {} ));
console.log(safeIsFunction( (async () => {}) ));
console.log(safeIsFunction( new class {} ));
console.log(safeIsFunction( {} ));
console.log(safeIsFunction( [] ));
console.log(safeIsFunction( 'a' ));
console.log(safeIsFunction( 1 ));
console.log(safeIsFunction( null ));
console.log(safeIsFunction( undefined ));
Tuttavia, si noti che questa soluzione potrebbe mostrare prestazioni inferiori rispetto ad altre opzioni disponibili a causa dell'ampio utilizzo di funzioni di ordine superiore.