我正在写这样的函数:
static checkString(p, opts = {
canBeEmpty: false,
canBeUndefined: false,
maxLength: undefined
}): boolean {
if (opts.canBeUndefined && typeof p === 'undefined') return true;
if (typeof p !== 'string') return false;
if (!opts.canBeEmpty && p.length === 0) return false;
if (typeof opts.maxLength !== 'undefined' && p.length > opts.maxLength) return false;
return true;
}
参数opts
具有默认值。当我想像这样使用它时:
ParamChecker.checkString(nick, {canBeUndefined: true})
编译器抛出错误:
类型'{canBeUndefined:true; }'不可分配给类型'{canBeEmpty:boolean; canBeUndefined:布尔值; maxLength:任意; }'。 类型'{canBeUndefined:true; }'缺少类型'{canBeEmpty中的以下属性:boolean; canBeUndefined:布尔值; maxLength:任意; }':canBeEmpty,maxLength [2345]
如何使并非具有默认值的参数的所有属性都调用函数?
答案 0 :(得分:2)
您正在为整个opts
提供默认值。
因此,如果您提供自己的opts
参数,则不会使用任何默认值。
opts = { canBeEmpty: false, canBeUndefined: false, maxLength: undefined }
即如果不传递opts,则使用默认对象。如果您确实通过了opts,则整个opts对象将被您通过的对象替换。
相反,将选项界面定义为可选属性。 然后,在函数内部将默认道具与传递的道具合并。
interface Options {
canBeEmpty?: boolean;
canBeUndefined?: boolean;
maxLength?: number;
}
const defaultOptions: Options = {
canBeEmpty: false,
canBeUndefined: false,
maxLength: undefined
};
const checkString = (p, options: Options): boolean => {
const mergedOptions = {
...defaultOptions,
...options
};
if (mergedOptions.canBeUndefined && typeof p === 'undefined') return true;
if (typeof p !== 'string') return false;
if (!mergedOptions.canBeEmpty && p.length === 0) return false;
if (typeof mergedOptions.maxLength !== 'undefined' && p.length > mergedOptions.maxLength) return false;
return true;
}
checkString("", { canBeUndefined: true })