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