Logo of defu

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(源对象)、keyvalue(当前值),如果应用了自定义合并,则应返回 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
  }
  */

注意: 该函数仅在默认值中定义的值是一个数组时才会被调用。

注意事项

  • objectdefaults 未被修改
  • 空值(nullundefined)会被跳过。如果您需要保留它们或采用不同的行为,请使用 defaults-deepomit-deeplodash.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。倾情打造 💖