Für diejenigen, die sich für funktionalen Stil interessieren oder nach einem ausdrucksstärkeren Ansatz für die Metaprogrammierung suchen (z. B. Typprüfung), könnte es interessant sein, Ramda zu sehen Bibliothek zu sehen, um eine solche Aufgabe zu erfüllen.
Der nächste Code enthält nur reine und punktfreie Funktionen:
const R = require('ramda');
const isPrototypeEquals = R.pipe(Object.getPrototypeOf, R.equals);
const equalsSyncFunction = isPrototypeEquals(() => {});
const isSyncFunction = R.pipe(Object.getPrototypeOf, equalsSyncFunction);
Ab ES2017 sind asyncFunktionen verfügbar, sodass wir sie auch überprüfen können:
const equalsAsyncFunction = isPrototypeEquals(async () => {});
const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);
Und dann kombinieren Sie sie zusammen:
const isFunction = R.either(isSyncFunction, isAsyncFunction);
Natürlich sollte die Funktion gegen nullund undefinedWerte geschützt werden, um sie "sicher" zu machen:
const safeIsFunction = R.unless(R.isNil, isFunction);
Und ein vollständiger Ausschnitt, um es zusammenzufassen:
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 ));
Beachten Sie jedoch, dass diese Lösung aufgrund der umfangreichen Verwendung von Funktionen höherer Ordnung möglicherweise eine geringere Leistung als andere verfügbare Optionen aufweist.