3
快餐文分享:
Defensive BASH Programming
https://kfirlavi.herokuapp.com/blog/2012/11/14/defensive-bash-programming/ 摘要: Here is my Katas for creating BASH programs that work. Nothing is new here, but from my experience pepole like to abuse BASH, forget computer science and create a Big ball of mud from their programs. Here I provide methods to defend your programs from braking, and keep the code tidy and clean.
由于 Shell 的糟糕设计, 作者提出了 防御性编程规范...
每日一句分享:
我们的计算机的知识就像一座金字塔,底层是数学,上面是数字电路,然后是汇编,再往上是操作系统、网络,数据库、高级编程语言、框架等等......
我们每个人不可能精通这个金子塔的每一层, 但是要掌握、理解构成这个金字塔的核心概念。
计算机科学的先驱 Alan Perlis 给低层语言(low-level languages)下的定义是:
“A programming language is low level when its programs require attention to the irrelevant.” [5]
如果用一门语言编写的程序需要处理不相关的东西,那这就是一门低层语言。
快餐文分享:
Go-通道用例大全
https://gfw.go101.org/article/channel-use-cases.html
摘要: 文章详细地解释了通道类型和通道值,以及各种通道操作的规则细节。本文的目的是展示尽量多的通道用例。但是,我们应该知道通道并不是Go支持的唯一同步技术,并且通道并不是在任何情况下都是最佳的同步技术。
这篇文章 我之前已经读过很多遍了,每次读完都有不同的感受,通过 channel 去模拟并发原语,并天然在语法层面上支持 coruntine,这就是 Golang 的设计魅力所在。
分享一篇刚刚在 V社刷到的帖子:
突然有点迷茫,关于学历的问题
我看了下这老哥的 Github,star 有 28k 多,可以说技术水平非常强了,并且有6年的工作经验,最近跳槽大厂时 还是因为 学历被卡了。哎,这也太难了。
快餐文分享:
ECMAScript 双月报告:TC39 11月会议提案进度汇总
摘要:这次 TC39 会议是 2020 年度最后一次全员会议。这次会议中没有任何提案争取到从 Stage 2 进入 Stage 3 的共识,也没有提案从 Stage 3 进入 Stage 4。
我喜欢 proposal-extensions 这个提案,现在的语言早就应该支持 Pointfree 特性了,就像管道似的~
分享一道面试题:
interface Logger { time: number; asyncLog:(msg: string) => Promise<string>; syncLog:(msg: string) => number; } type Translate<T> = /** 你需要实现的部分 **/; // 要求 Translate // 1. 提取出为函数类型的属性,丢弃掉其它类型的属性 // 2. 将函数返回类型调整为形参类型(假定有且只有一个参数) // 实现效果如下: type T0 = Translate<Logger>; // 等价于 type T0 = { // 其它属性被丢弃 asyncLog: (arg: string) => string; // return 类型被调整为跟 arg 保持一致 syncLog: (arg: string) => string; // return 类型被调整为跟 arg 保持一致 } const result: T0 = { asyncLog(msg: string) { return msg } };
先实现一个类型可以提取出指定类型,用来筛选出所有为函数类型的属性
type FilterTypes<T, U> = { [Key in keyof T]: T[Key] extends U ? Key : never }; // 看看阶段性成果 type T = FilterTypes<Logger, Function>; // type T = { // time: never; // syncLog: "syncLog"; // asyncLog: "asyncLog"; // }
在 1 的基础上剔除
never
,取出所有 key
type FilterKeys<T, U> = FilterTypes<T, U>[keyof T]; // 看看阶段性成果 type T = FilterKeys<Logger, Function>; // type T = "syncLog" | "asyncLog"
在 2 的基础上我们可以使用
Pick
提取出子类型
type SubType<T, U> = Pick<T, FilterKeys<T, U>>; // 看看阶段性成果,此时我们已经成功提取出了所有类型为函数的属性,满足要求 type T = SubType<Logger, Function>; // type T = { // syncLog: (msg: string) => number; // asyncLog: (msg: string) => Promise<string>; // }
在 3 的基础上我们再使用
infer
将函数的返回类型改为形参类型
// 将参数类型作为返回类型 type ArgAsReturn<T> = { [K in keyof T]: T[K] extends ((arg: infer U) => any) ? ((arg: U) => U): never; } // 我们最终得到了 Translate type Translate = ArgAsReturn<SubType<Logger, Function>>; // 看看最后效果,满足要求 type T = Translate<Logger>; // type T0 = { // asyncLog: (arg: string) => string; // syncLog: (arg: string) => string; // }
文中部分示例来自TypeScript 官网 - 高级类型,面试题灵感来自中国 LeetCode,原题太绕且有 Redux 倾向,因此做了简单改造,基本思路一致甚至更全面。
分享一个代码优化技巧:
如何将优化双分支的代码?
condition ? A : B
在大多数弱类型语言中可转换为[A, B][condition]
Last updated
Was this helpful?