这里说的是不应该使用 if-else 的地方尽量不去写 if,而不是去掉所有的 if-else

不必要的 else 块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function func(arg) {
if (arg) {
// do something
} else {
// do something
}
}
// 这里的else明显可以去掉
function func(arg) {
if (arg) {
// do something
}
// do something
}

价值分配

有些时候不需要生命个变量,然后再赋值返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function func(arg) {
let gender;
if (arg === 0) {
gender = "woman";
} else if (arg === 1) {
gender = "man";
} else {
gender = "unknown";
}
}
// 为什么需要多写一个gender呢
function func(arg) {
if (arg === 0) return "woman";
if (arg === 1) return "man";
throw new Error("非法参数");
}

简单值多个条件,转成对象形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function func(arg) {
if (arg === "xxx") {
// do something
} else if (arg === "yyy") {
// do something
} else {
throw new Error("非法参数");
}
}
// 不好修改,而且代码很丑
function func(arg) {
const actions = {
xxx: () => {
/* do something */
},
yyy: () => {
/* do something */
},
// 以后要加什么这里直接在这里加
};
if (actions["xxx"]) {
actions["xxx"]();
} else {
throw new Error("非法参数");
}
}

复杂条件,改用策略模式

1
2
3
4
5
6
7
8
9
function func(arg1, arg2, arg3) {
if ((arg1 === "xxx" && arg2 === "yyy") || arg3 === "zzz") {
// do something
} else if (arg1 === "xxx" || (arg2 === "yyy" && arg3 === "zzz")) {
// do something
} else {
throw new Error("非法参数");
}
}

如果是这种复杂的条件,对象的形式就实现不了了,这没有办法了吗?

其实有个设计模式叫策略模式,先上个策略模式的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// js版:
function exeStrategyActions(actions) {
actions.some(([flag, action]) => {
if (flag) {
action();
}
return flag;
});
}
// ts版:
type StrategyAction = [boolean, () => void];
function exeStrategyActions(actions: StrategyAction[]) {
actions.some((item) => {
const [flag, action] = item;
if (flag) {
action();
}
return flag;
});
}

用法也很简单,比如上面的 if 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function func(arg1, arg2, arg3) {
exeStrategyActions([
[
(arg1 === "xxx" && arg2 === "yyy") || arg3 === "zzz",
() => {
/* do something */
},
],
[
arg1 === "xxx" || (arg2 === "yyy" && arg3 === "zzz"),
() => {
/* do something */
},
],
[
true,
() => {
throw new Error("非法参数");
},
],
]);
}

exeStrategyActions 函数会一个一个寻找条件是 true 的值,直到找到 true,然后执行传进去的回调函数,

一些工具类:

  • p-limit:promise 并发限制
  • await-to-js:Async await包装器,便于错误处理
  • delay:将setTimeout promise化
  • yocto-queue: 简单的队列数据结构,(入队出队时间O(1))
  • mitt:简单实用的事件总线工具
  • autofit.js:自适应屏幕大小
  • class-transformer: 将object转成class
  • class-validator: 简化验证的库
  • zod: 轻量级类型验证库

适合node:

  • consola 日志、提示库
  • chokidar:跨平台的文件监听库
  • walkdir: 遍历文件夹
  • fast-glob:轻量快速的遍历文件夹

一些cli工具:

  • npkill:快速删除node_modules目录
  • npm-check-updates:检查项目依赖更新(快捷命令ncu)
  • nvm-windows:windows下的node版本管理工具(设置淘宝镜像下载更快:https://npmmirror.com/mirrors/node/)

cli

  • prompts:命令行提示工具,可以用来写交互式cli
  • cac: 命令行参数提示、解析工具
  • mri/minimist: 命令行参数解析,mri更轻量化
0%