สำหรับผู้ที่สนใจในรูปแบบการทำงานหรือมองหาวิธีการแสดงออกที่ชัดเจนมากขึ้นเพื่อใช้ในการเขียนโปรแกรมเมตา (เช่นการตรวจสอบประเภท) มันอาจเป็นเรื่องที่น่าสนใจที่จะเห็นห้องสมุดRamdaเพื่อทำงานให้สำเร็จ
โค้ดถัดไปมีฟังก์ชั่น pure และ pointfree เท่านั้น:
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 ));
อย่างไรก็ตามโปรดทราบว่าโซลูชันนี้อาจแสดงประสิทธิภาพน้อยกว่าตัวเลือกอื่น ๆ เนื่องจากการใช้งานฟังก์ชั่นการสั่งซื้อที่สูง