类型系统的准确性和实用性

什么是准确性和实用性

举一段例子:

  1. var a: int[] = [1, 2, 3]
  2. var b = a[index]
  3. // ~: b 是什么类型?

以上代码在运行时,如果 index 未越界,则 b 的类型是 int,否则为 null

从准确性考虑:b 的类型是 int | null
从实用性考虑:越界访问数组的情况很少,将 b 的类型看作 int,可以简化代码。

结论:实用性优先

编程语言不只是一种技术,更是为了解决用户需求的产品。

准确性有助于帮助用户降低调试时间,但为了准确性,就可能会增加编码的时间。
从用户角度,用户更关心编程+调试的总时间是否减少,而不只关心调试时间是否减少。

所谓的实用性优先,即优先保证用户只需用最少的代码,即可完成写出准确性不高的代码。
这时用户可以选择通过增加代码量来提升准确性,或通过测试保证实际的结果是符合预期的,而不应该在编程语言层面强制要求用户写出 100% 准确的代码。因为即使语言层面 100% 准确的代码,也不能确保没有 BUG。