उन लोगों के लिए जो कार्यात्मक शैली में रुचि रखते हैं, या मेटा प्रोग्रामिंग (जैसे टाइप चेकिंग) में उपयोग करने के लिए अधिक अभिव्यंजक दृष्टिकोण की तलाश करते हैं, ऐसे कार्य को पूरा करने के लिए रामा पुस्तकालय देखना दिलचस्प हो सकता है ।
अगले कोड में केवल शुद्ध और पॉइंटफ़्री फ़ंक्शन शामिल हैं:
const R = require('ramda');
const isPrototypeEquals = R.pipe(Object.getPrototypeOf, R.equals);
const equalsSyncFunction = isPrototypeEquals(() => {});
const isSyncFunction = R.pipe(Object.getPrototypeOf, equalsSyncFunction);
ES2017 के अनुसार, async
फ़ंक्शन उपलब्ध हैं, इसलिए हम उनके खिलाफ भी जांच कर सकते हैं:
const equalsAsyncFunction = isPrototypeEquals(async () => {});
const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);
और फिर उन्हें एक साथ संयोजित करें:
const isFunction = R.either(isSyncFunction, isAsyncFunction);
बेशक, समारोह के खिलाफ रक्षा की जानी चाहिए null
और undefined
मूल्यों, तो यह "सुरक्षित" बनाने के लिए:
const safeIsFunction = R.unless(R.isNil, isFunction);
और, पूरा करने के लिए स्निपेट:
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 ));
हालाँकि, ध्यान दें कि उच्च-स्तरीय कार्यों के व्यापक उपयोग के कारण यह समाधान अन्य उपलब्ध विकल्पों की तुलना में कम प्रदर्शन दिखा सकता है।