Đối với những người quan tâm đến phong cách chức năng, hoặc tìm kiếm cách tiếp cận biểu cảm hơn để sử dụng trong lập trình meta (chẳng hạn như kiểm tra kiểu), thật thú vị khi xem Ramda thư viện thực hiện nhiệm vụ đó.
Mã tiếp theo chỉ chứa các hàm thuần túy và không có điểm:
const R = require('ramda');
const isPrototypeEquals = R.pipe(Object.getPrototypeOf, R.equals);
const equalsSyncFunction = isPrototypeEquals(() => {});
const isSyncFunction = R.pipe(Object.getPrototypeOf, equalsSyncFunction);
Kể từ ES2017, các async
chức năng cũng có sẵn, vì vậy chúng tôi cũng có thể kiểm tra lại chúng:
const equalsAsyncFunction = isPrototypeEquals(async () => {});
const isAsyncFunction = R.pipe(Object.getPrototypeOf, equalsAsyncFunction);
Và sau đó kết hợp chúng lại với nhau:
const isFunction = R.either(isSyncFunction, isAsyncFunction);
Tất nhiên, chức năng nên được bảo vệ chống lại null
và undefined
các giá trị, vì vậy để làm cho nó "an toàn":
const safeIsFunction = R.unless(R.isNil, isFunction);
Và, hoàn thành đoạn trích để tổng hợp:
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 ));
Tuy nhiên, lưu ý rằng giải pháp này có thể hiển thị ít hiệu suất hơn các tùy chọn khả dụng khác do sử dụng rộng rãi các chức năng bậc cao hơn.