Pour ceux qui s'intéressent au style fonctionnel ou qui recherchent une approche plus expressive à utiliser dans la méta-programmation (comme la vérification de type), il pourrait être intéressant de voir la bibliothèque Ramda pour accomplir une telle tâche.
Le code suivant ne contient que des fonctions pures et sans point:
const R = require('ramda');
const isPrototypeEquals = R.pipe(Object.getPrototypeOf, R.equals);
const equalsSyncFunction = isPrototypeEquals(() => {});
const isSyncFunction = R.pipe(Object.getPrototypeOf, equalsSyncFunction);
Depuis ES2017, des asyncfonctions sont disponibles, nous pouvons donc également les vérifier:
const equalsAsyncFunction = isPrototypeEquals(async () => {});
const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);
Et puis combinez-les ensemble:
const isFunction = R.either(isSyncFunction, isAsyncFunction);
Bien sûr, la fonction doit être protégé contre nullet undefinedvaleurs, afin de le rendre « sûr »:
const safeIsFunction = R.unless(R.isNil, isFunction);
Et, un extrait complet pour résumer:
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 ));
Cependant, notez que cette solution pourrait afficher moins de performances que les autres options disponibles en raison de l'utilisation intensive de fonctions d'ordre supérieur.