Bagi mereka yang tertarik dengan gaya fungsional, atau mencari pendekatan yang lebih ekspresif untuk digunakan dalam pemrograman meta (seperti pengecekan jenis), mungkin menarik untuk melihat Ramda. perpustakaan untuk menyelesaikan tugas tersebut.
Kode selanjutnya hanya berisi fungsi murni dan pointfree:
const R = require('ramda');
const isPrototypeEquals = R.pipe(Object.getPrototypeOf, R.equals);
const equalsSyncFunction = isPrototypeEquals(() => {});
const isSyncFunction = R.pipe(Object.getPrototypeOf, equalsSyncFunction);
Pada ES2017, async
fungsi tersedia, sehingga kami juga dapat memeriksanya:
const equalsAsyncFunction = isPrototypeEquals(async () => {});
const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);
Dan kemudian menggabungkannya:
const isFunction = R.either(isSyncFunction, isAsyncFunction);
Tentu saja, fungsi harus dilindungi null
dan undefined
bernilai, sehingga membuatnya "aman":
const safeIsFunction = R.unless(R.isNil, isFunction);
Dan, lengkapi cuplikan untuk menyimpulkan:
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 ));
Namun, perhatikan bahwa solusi ini dapat menunjukkan kinerja yang lebih rendah daripada opsi lain yang tersedia karena penggunaan fungsi-fungsi tingkat tinggi yang ekstensif.