柯里化类型检查通过分离“检查类型”和“检查值”提升复用性与表达力,支持常见内置类型判断,并可组合扩展语义化校验逻辑,兼顾灵活性与边界处理。

JavaScript 中可以通过柯里化把类型检查逻辑抽离成可复用的高阶函数,让检查函数既能固定类型参数,又能延迟接收待检测值,提升代码的表达力和复用性。
什么是柯里化 + 类型检查的组合价值
柯里化把多参数函数拆成一系列单参数函数。用于类型检查时,它能将「检查什么类型」和「检查哪个值」分离:前者在初始化时确定,后者在调用时传入。这样就能避免重复写 typeof x === 'string' 或 x instanceof Array 这类判断,也方便统一处理边界情况(如 null、undefined)。
基础实现:支持常见内置类型的柯里化检查器
下面是一个通用的柯里化类型检查函数,支持字符串、数字、布尔、函数、对象、数组、日期、正则、Promise 等:
const isType = (type) => (value) => {
if (type === 'null') return value === null;
if (type === 'undefined') return value === undefined;
if (type === 'function') return typeof value === 'function';
if (type === 'object') return value !== null && typeof value === 'object' && !Array.isArray(value);
return Object.prototype.toString.call(value) === `[object ${type.charAt(0).toUpperCase() + type.slice(1)}]`;
};
立即学习“Java免费学习笔记(深入)”;
使用示例:
-
const isString = isType('string');→isString('hello')返回true -
const isArray = isType('array');→isArray([1,2])返回true -
const isDate = isType('date');→isDate(new Date())返回true
进阶用法:组合与扩展
柯里化后可以轻松组合多个检查逻辑,比如「非空字符串」或「有效数组」:
const isNonEmptyString = (s) => isString(s) && s.length > 0;
const isValidArray = (arr) => isArray(arr) && arr.length > 0;
也可以封装更语义化的检查器:
-
const required = isType('string');(表示必填字符串) const optionalNumber = (v) => v === undefined || isType('number')(v);- 配合 Joi / Zod 等库做运行时校验时,柯里化函数可作为自定义规则的工厂函数
注意事项与优化建议
实际项目中要注意几点:
- 避免过度柯里化:简单判断如
Array.isArray已足够高效,不必强套柯里化 - 区分
null和object:原生typeof null === 'object'是历史 bug,柯里化检查器需显式处理 - 性能敏感场景慎用
Object.prototype.toString.call:虽准确但比Array.isArray略慢,高频调用可缓存结果或按需分支优化 - 考虑 TypeScript 配合:柯里化函数可配完整类型标注,让类型推导更精准(例如返回
(value: unknown) => value is string)


















