TypeScript
any & 默认值
对于需要设置吗默认值的场景, any 比较合适,因为往往 l 类型已经受到外部泛型限制,此时只能通过默认的 any 来跳过验证,让一些 大部分可通用类型,鸭子类型,甚至怪异行为 可以正常生效。最好的方式是添加泛型约束,且约束未最小接口。
interface CanCompare {
comp: (t: any) => number
}
defaultComparator = <I extends CanCompare>(l: I, r: typeof l) => l.comp(r)
isValid<T extends CanCompare>( comparator? = defaultComparator) {
}
缺点是接口必须实现。
Programming
递归 & 上下文
递归流程中变量,若与上下文切换强相关,一般放入递归函数参数中,而不是某个函数的局部变量。
此时的切换上下文处会伴随逻辑判断,起到流程的分支推演作用。
若用循环模拟,需自行管理堆栈,需要记录层级信息,或被访问信息,需要增加局部变量,才能正确地进行逻辑判断。
递归 & 回溯
由于递归隐藏了堆栈及上下文转换过程(递归时进入,返回时返回上一层),所以可以很方便地实现回溯(在递归声明后),但是用循环代替递归时,就较难表述回溯的时机。