如何在并非TS中具有默认值的参数的所有属性的情况下调用函数?

时间:2019-01-30 10:44:56

标签: typescript

我正在写这样的函数:

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]

如何使并非具有默认值的参数的所有属性都调用函数?

1 个答案:

答案 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 })

TypeScript Playground