源码阅读系列-omit.js

73 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

本文参加了由公众号@若川视野 发起的每周源码共读活动,   点击了解详情一起参与。

这是源码共读的第36期 | 可能是历史上最简单的一期 omit.js 剔除对象中的属性 package.json

"main": "lib/index.js", // 入口文件
"module": "es/index.js", // ESM规范声明入口文件
"types": "index.d.ts", // ts 类型声明文件

主代码

/**剔除对象中的属性: 将对象 ojb 剔除 指定的键值对
* Object {obj}
* Array {fields}
*/
function omit(obj, fields) {
  const shallowCopy = Object.assign({}, obj); // 浅复制一份对象
  for (let i = 0; i < fields.length; i += 1) { // 遍历fields一般比遍历shallowCopy更少
    const key = fields[i]; // 当前键
    delete shallowCopy[key]; // 删除对象中的 key-value 对
  }
  return shallowCopy;
}

// 例子
let obj = { a: 'a', b: 'b'}
let fields1 = ['a']
let ret = omit(obj, fields1) // {b: 'b'}
let fields2 = ['a', 'b']
let ret = omit(obj, fields2) // {}
console.log(obj) // { a: 'a', b: 'b'}
export default omit;

test
通过测试用例可以看出效果

import assert from 'assert';
import omit from '../src';

describe('omit', () => {
it('should create a shallow copy', () => {
 const benjy = { name: 'Benjy' };
 const copy = omit(benjy, []);
 assert.deepEqual(copy, benjy); // true, 值一样
 assert.notEqual(copy, benjy); // false, 指针不一样
});

it('should drop fields which are passed in', () => {
 const benjy = { name: 'Benjy', age: 18 };
 assert.deepEqual(omit(benjy, ['age']), { name: 'Benjy' }); // true, 值一样
 assert.deepEqual(omit(benjy, ['name', 'age']), {}); // true, 值一样
});
});

ts

declare function Omit<T, K extends keyof T>(
  obj: T,
  keys: Array<K>
): Omit<T, K>;

export default Omit;

包类

  1. father 用于打包
  • ✔︎ 基于 docz 的文档功能(不再维护,建议 迁移到 dumi 或 单独安装 docz 使用)
  • ✔︎ 基于 rollup 和 babel 的组件打包功能
  • ✔︎ 支持 TypeScript
  • ✔︎ 支持 cjs、esm 和 umd 三种格式的打包
  • ✔︎ esm 支持生成 mjs,直接为浏览器使用
  • ✔︎ 支持用 babel 或 rollup 打包 cjs 和 esm
  • ✔︎ 支持多 entry
  • ✔︎ 支持 lerna
  • ✔︎ 支持 css 和 less,支持开启 css modules
  • ✔︎ 支持 test
  • ✔︎ 支持用 prettier 和 eslint 做 pre-commit 检查
  1. assert用于测试
  2. eslint用于语法检查
const base = require('@umijs/fabric/dist/eslint');

module.exports = {
  ...base,
  rules: {
    ...base.rules,
    'no-template-curly-in-string': 0,
    'prefer-promise-reject-errors': 0,
    'react/no-array-index-key': 0,
    'react/sort-comp': 0,
    'import/no-named-as-default': 0,
    'import/no-named-as-default-member': 0,
  },
};
//  `"off"` or `0` - turn the rule off(关闭检查)
//  `"warn"` or `1` - turn the rule on as a warning (doesn't affect exit code)(警告,不影响代码运行)
//  `"error"` or `2` - turn the rule on as an error (exit code will be 1)(报错,影响代码运行)
  1. np A better npm publish
  2. rc-tools用于离线测试React组件的包

总结:

  1. 对于ommit方法原解读与实现
  2. 对 ts 语法的学习
  3. 对相应包的了解与学习
  4. 对packge.json 的关键字的学习