TypeScript

any & 默认值

image.png
image.png
对于需要设置吗默认值的场景, any 比较合适,因为往往 l 类型已经受到外部泛型限制,此时只能通过默认的 any 来跳过验证,让一些 大部分可通用类型,鸭子类型,甚至怪异行为 可以正常生效。最好的方式是添加泛型约束,且约束未最小接口。

  1. interface CanCompare {
  2. comp: (t: any) => number
  3. }
  4. defaultComparator = <I extends CanCompare>(l: I, r: typeof l) => l.comp(r)
  5. isValid<T extends CanCompare>( comparator? = defaultComparator) {
  6. }

缺点是接口必须实现。

Programming

递归 & 上下文

递归流程中变量,若与上下文切换强相关,一般放入递归函数参数中,而不是某个函数的局部变量。
此时的切换上下文处会伴随逻辑判断,起到流程的分支推演作用。
若用循环模拟,需自行管理堆栈,需要记录层级信息,或被访问信息,需要增加局部变量,才能正确地进行逻辑判断。

递归 & 回溯

由于递归隐藏了堆栈及上下文转换过程(递归时进入,返回时返回上一层),所以可以很方便地实现回溯(在递归声明后),但是用循环代替递归时,就较难表述回溯的时机。