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。倾情打造 💖