İşlevsel stille ilgilenenler veya meta programlamada (tip kontrolü gibi) kullanmak için daha anlamlı bir yaklaşım arayanlar için, bu tür bir görevi yerine getirmek için Ramda kütüphanesini görmek ilginç olabilir .
Sonraki kod yalnızca saf ve noktasız işlevler içerir:
const R = require('ramda');
const isPrototypeEquals = R.pipe(Object.getPrototypeOf, R.equals);
const equalsSyncFunction = isPrototypeEquals(() => {});
const isSyncFunction = R.pipe(Object.getPrototypeOf, equalsSyncFunction);
ES2017'den itibaren async
fonksiyonlar mevcuttur, böylece bunlara karşı da kontrol edebiliriz:
const equalsAsyncFunction = isPrototypeEquals(async () => {});
const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);
Ve sonra bunları birleştirin:
const isFunction = R.either(isSyncFunction, isAsyncFunction);
Tabii ki, işlev "güvenli" hale getirmek için null
ve undefined
değerlere karşı korunmalıdır :
const safeIsFunction = R.unless(R.isNil, isFunction);
Ve özetlemek için snippet'i tamamlayın:
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 ));
Bununla birlikte, bu çözümün, üst düzey işlevlerin yaygın kullanımı nedeniyle mevcut diğer seçeneklerden daha az performans gösterebileceğini unutmayın.