Dla tych, którzy są zainteresowani stylem funkcjonalnym lub szukają bardziej wyrazistego podejścia do wykorzystania w metaprogramowaniu (takim jak sprawdzanie typów), interesujące może być obejrzenie biblioteki Ramda, aby wykonać takie zadanie.
Następny kod zawiera tylko czyste i bezcelowe funkcje:
const R = require('ramda');
const isPrototypeEquals = R.pipe(Object.getPrototypeOf, R.equals);
const equalsSyncFunction = isPrototypeEquals(() => {});
const isSyncFunction = R.pipe(Object.getPrototypeOf, equalsSyncFunction);
Począwszy od ES2017, asyncfunkcje są dostępne, więc możemy je również sprawdzić:
const equalsAsyncFunction = isPrototypeEquals(async () => {});
const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);
A następnie połącz je razem:
const isFunction = R.either(isSyncFunction, isAsyncFunction);
Oczywiście funkcja powinna być chroniona przed wartościami nulli undefinedwartościami, aby była „bezpieczna”:
const safeIsFunction = R.unless(R.isNil, isFunction);
I uzupełnij fragment kodu, aby podsumować:
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 ));
Należy jednak pamiętać, że to rozwiązanie może wykazywać mniejszą wydajność niż inne dostępne opcje z powodu szerokiego użycia funkcji wyższego rzędu.