V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  ruxuan1306  ›  全部回复第 2 页 / 共 17 页
回复总数  330
1  2  3  4  5  6  7  8  9  10 ... 17  
我看之前楼层都在情绪输出,我来说说我的思考吧。



两个前提:
1. 老板只在意业务功能是否实现,没人在意前后端之间的接口质量;
2. 督促后端交付高质量接口的沟通成本远大于前端写几行 map 的开发成本;

故结论,前端兼容。



问题是,对于前端的某一字段,不同的后端提交、响应不同,甚至值的类型也不同。
导致在写 TypeScript 时,就要定义大量 TS 类型,还很难起名。
但仔细想想我们真的需要这些“一次性”类型吗?



看个例子,假设我们有两个接口:

```JavaScript
// id 查 user
const res = fetch.get('/user', { id: 1 })
console.log(res.body) // { id: 1, name: 'alice' }

// id 改 user 名
const res = fetch.post('/user', { user_id: '1', new_username: '' })
console.log(res.body) // { code: 1 }
```

很难受吧,查和改的字段居然不一致。
那我用户 ID 究竟叫 id 还是 user_id ?类型究竟是 number 还是 string ?

很简单,按前端方便来:

```
type User = {
userId: string,
username: string
}

<div>
<div>用户 ID:{{userId}}</div>
<div>用户名:<input type="text" value="{{username}}" /></div>
</div>
```



???



因为 JavaScript 里常用驼峰命名,userId 通常也只是展示,不会涉及什么数值运算,绑定 input 之类也比较方便…

噢,哈哈,你肯定早就知道这些,我知道你是在疑惑,接口怎么办?

别急。



我们知道,TypeScript 类型系统很好很强,除非 any 泛滥。
要想抑制 any 渗入 TS ,就要观察 any 从哪产生:

什么函数返回 any ?

- JSON.parse()
- fetch()
- ...

喔,外部数据流入 TS 时,就是 any ,有才有德的我知道,此时我应该立刻手动为标记类型:

```JavaScript
// 接口响应类型
type GetUser = { id: number, name: string }

// 前端易用类型
type User = { userId: string, username: string }

function fetchUser(userId: string) {
// 外部数据
const res = fetch.get('/user', { id: Number(userId) })
console.log(res.body) // { id: 1, name: 'alice' }

// 标记类型 any -> GetUser
const data: GetUser = res.body

// 转为前端易用的格式
const user: User = {
userId: String(data.id ?? ''),
username: data.name
}
return user
}
```

很好很完美,我们成功封装了一个接口请求函数,它能通过 string 的 userId ,查到 User 数据,以前端想要的格式。

但多看一眼,我们真的有必要定义 GetUser 吗?

简化下可以吗:

```JavaScript
type User = { userId: string, username: string }

function fetchUser(userId: string): User {
const res = fetch.get('/user', { id: Number(userId) })
return {
userId: String(res.body.id ?? ''),
username: res.body.name
}
}
```

噢,虽然 res.body 是 any ,虽然按照 TypeScript 最佳实践我应该马上声明它的类型,但事实上,完全可以将这个明晰 any 的过程延迟到数据转换一并进行。

这样一切就变得简单多了,只要我守好数据流入和流出的关口,那无论多离谱的后端,我都不需撕逼,分钟对接:

```JavaScript
function updateUser(userId: string, username: string): boolean {
const res = fetch.post('/user', {
user_id: Number(userId),
new_username: username
})
return res.code === 1
}
```


于是作为前端:
在开发阶段,我以最舒适的姿势定义 State 的数据结构、绑定 UI 组件。
在联调阶段,我直接对着浏览器抓包的响应体,实现关口函数内的转换。
完全摆脱各接口字段定义不一致、实际响应和接口文档不符、string 和 number 类型没对上之类来回沟通筋疲力尽的鸡零狗碎。



再温故一遍:
1. 老板只在意业务功能是否实现,没人在意前后端之间的接口质量;
2. 督促后端交付高质量接口的沟通成本远大于前端写几行 map 的开发成本;
2023-11-12 17:58:20 +08:00
回复了 victorc 创建的主题 OpenAI GPT 是程序员卖给资本家的绞索
在公司开发流程中,开各种评审会议、写各种留痕文档、读历史屎山、和测试来回拉锯的工时最多,编码的占比非常之小。
2023-11-12 17:54:17 +08:00
回复了 Richard14 创建的主题 程序员 有没有数学和算法好的朋友,计算线性回归用啥算法最快?
哦不好意思没注意,原来是在对比计算机运行的效率,不是人算出结果的效率
2023-11-12 17:52:43 +08:00
回复了 Richard14 创建的主题 程序员 有没有数学和算法好的朋友,计算线性回归用啥算法最快?
2023-11-12 12:35:52 +08:00
回复了 61162833 创建的主题 Java Java 中一个保存了 1 万个整数的 ArrayList 占多少内存?
@yfugibr 自动扩容是在 append 时原容量不够才发生的,new 时候给定大小,然后直接用下标设置就不会触发扩容。
2023-11-11 15:18:58 +08:00
回复了 tasselyue 创建的主题 职场话题 即将毕业该怎么办? 好迷茫
想太远了,这才大三上,考虑考研考公就业那都是明天春天后的事。

---

**“我也意识到了,但我不知道该怎么改变。”**

先从每天运动开始。

人在成年后,只有健身是一分努力一分收获。

健身的反馈周期也比较合适,叠上新手福利期,最多一两周就能看到配速变快了、心率变低了、肌肉变强了,这些都是结结实实的正反馈。

**你必须首先做成一件事,才能获得自己有能力做成事的信心。**

躺在宿舍床上畏畏缩缩瞻前顾后?

起来。
训练。
2023-08-19 16:34:16 +08:00
回复了 xiyy02 创建的主题 程序员 既然总是避免不了被淘汰,那努力钻研技术的意义是什么?
你只是基因驾驶的蛋白质机甲。

基因主人为你这套智能机甲设计了两个任务:

1. 摄入能量,维持自己稳定运行;
2. 在自己损坏之前,制造出新的机甲。
@BBCCBB 确实,你一说我才发现,第一句话实际是在预先合理化自己之后的行为。
b 站有个“戒社”,经常读一些赌狗私信,OP 文章的第一句话,和那些私信第一句好像。

想起来之前看过的一句话:

大多数时候我们以为自己在思考,其实都是在对自身的行为和欲望进行合理化,这正是人类被称作“自我解释的动物”的原因。
yoga 13s ,三千左右,轻薄质感好,但是处理器可能有点老。
2023-06-13 15:25:30 +08:00
回复了 Jianzs 创建的主题 旅行 毕业旅行和女朋友去新疆,跟小团游有什么注意事项?
@paopjian 不至于尿不湿,地广人稀,路边随便一停草丛反斜后面就解了。
2023-06-13 15:19:17 +08:00
回复了 Jianzs 创建的主题 旅行 毕业旅行和女朋友去新疆,跟小团游有什么注意事项?
@Jirajine 我在伊犁二十多年了,也走过口岸机场海关,新疆安检确实多,出入境甚至要登记指纹声纹虹膜,但谁有空管你手机上的梯子 TG 油管推特交易所?

预计新疆今年接待游客上亿人次。
1%是一百万,0.1%是十万,假设真有一万个游客不幸被查手机,0.01%算不算大量?

正常人就光明坦荡玩,不到新疆不知中国之大,不到伊犁不知新疆之美,大美伊犁欢迎你们!
2023-06-12 14:00:54 +08:00
回复了 Jianzs 创建的主题 旅行 毕业旅行和女朋友去新疆,跟小团游有什么注意事项?
@Jirajine 迫害妄想,谁闲着翻你手机。

你要是有吸毒史,那车站宾馆一刷身份证肯定民警就来聊了,但你一普通人,谁没事查你?
函数 y=f(x)只在定义域内有意义。

光懂道理(函数),不知道使用的边界(定义域),(函数值)没有意义。

就比如这两句古话:
1. 大丈夫能屈能伸;
2. 大丈夫宁死不屈。
2023-05-13 19:59:54 +08:00
回复了 yyznl 创建的主题 生活 人活着到底是要及时行乐还是需要未雨绸缪
无论选择享乐还是奋斗,知行合一、贯彻始终即可。

活得最别扭的就是那种允许自己随便做决定、随便后悔的人。

二十岁时信仰及时行乐,三十了看到当年一起撒尿和泥的阿猫阿狗西装领带月入过万了又后悔当年没奋斗。
一般来说设备需要通过子网掩码判断对方和自己是不是同一网段。如果目标 IP 和本地 IP 与子网掩码与运算后一致,则直接 ARP 取回 MAC ,交换机直发;如果不一致,则丢给默认网关。

但好像从没看过公网 IP 会伴随分配一个子网掩码?
1  2  3  4  5  6  7  8  9  10 ... 17  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1150 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 36ms · UTC 17:52 · PVG 01:52 · LAX 09:52 · JFK 12:52
Developed with CodeLauncher
♥ Do have faith in what you're doing.