defu
递归地分配默认属性。轻量且快速。
递归地分配默认属性。轻量且快速。
安装
安装包
# yarn
yarn add defu
# npm
npm install defu
# pnpm
pnpm install defu
用法
import { defu } from "defu";
const options = defu(object, ...defaults);
最左边的参数在分配默认值时具有更高的优先级。
参数
- object (Object): 目标对象。
- source (Object): 源对象。
import { defu } from "defu";
console.log(defu({ a: { b: 2 } }, { a: { b: 1, c: 3 } }));
// => { a: { b: 2, c: 3 } }
与 CommonJS 一起使用
const { defu } = require("defu");
自定义合并器
有时默认的合并策略并不理想。使用 createDefu,我们可以创建一个具有不同合并策略的自定义实例。
此函数接受 obj(源对象)、key 和 value(当前值),如果应用了自定义合并,则应返回 true。
示例: 求和而非覆盖
import { createDefu } from "defu";
const ext = createDefu((obj, key, value) => {
if (typeof obj[key] === "number" && typeof value === "number") {
obj[key] += value;
return true;
}
});
ext({ cost: 15 }, { cost: 10 }); // { cost: 25 }
函数合并器
使用 defuFn,如果用户提供一个函数,它将使用默认值而不是合并来调用。
这对于默认值操作很有用。
示例: 从默认值(数组)中过滤掉某些项并将计数默认值增加20。
import { defuFn } from "defu";
defuFn(
{
ignore: (val) => val.filter((item) => item !== "dist"),
count: (count) => count + 20,
},
{
ignore: ["node_modules", "dist"],
count: 10,
},
);
/*
{
ignore: ['node_modules'],
count: 30
}
*/
注意: 如果默认值未定义,所定义的函数将不会被调用并保持为值。
数组函数合并器
defuArrayFn 类似于 defuFn,但仅适用于在默认值中定义的数组值。
示例: 从默认值(数组)中过滤掉某些项并将计数默认值增加20。
import { defuArrayFn } from 'defu'
defuArrayFn({
ignore: (val) => val.filter(i => i !== 'dist'),
count: () => 20
}, {
ignore: [
'node_modules',
'dist'
],
count: 10
})
/*
{
ignore: ['node_modules'],
count: () => 20
}
*/
注意: 该函数仅在默认值中定义的值是一个数组时才会被调用。
注意事项
object和defaults未被修改- 空值(
null和undefined)会被跳过。如果您需要保留它们或采用不同的行为,请使用 defaults-deep 或 omit-deep 或 lodash.defaultsdeep。 - 对
__proto__和constructor键的赋值将被跳过,以防止对象污染带来的安全问题。 - 将连接
array值(如果定义了默认属性)
console.log(defu({ array: ["b", "c"] }, { array: ["a"] }));
// => { array: ['b', 'c', 'a'] }
类型
我们公开 Defu 作为一种类型工具,用于返回一个遵循 defu 规则的合并类型。
import type { Defu } from 'defu'
type Options = Defu<{ foo: 'bar' }, [{}, { bar: 'baz' }, { something: 42 }]>
// returns { foo: 'bar', bar: 'baz', 'something': 42 }
许可
MIT。倾情打造 💖