• 云中行走
    2024-07-24 来自陕西
    我的理解和问题: 我理解的文中提到的声明和求值的区别是:声明 ● 范型声明(声明)是在已有的结构中使用范型,使得已有结构更高阶,类型更通用,提升了原有结构的抽象层级,如接口范型,函数范型。 ● 工具类型(声明)首先是用type类型声明的,方便后面写表达式类型,把范型变量放置到表达式类型中,这样得到的仍待是是一个原有结构更加通用的结构,保持了范型参数的自身的完整性 ● 范型工具也是用type声明的,不过内部可以对范型变量做转换或处理,是用来对求输入的类型进行特定操作,以得到一个新的类型。 老师在文中提到的“范型声明”应该是输入类型和输出类型具有一致的结构,上述的范型声明和工具类型,显然是符合的,表现为 实例化后的类型 extends 范型类型<infer x>, 此时的x即为实例化时的范型参数, 按此逻辑,求值的范型工具,就没有上述的反推范型参数的表现,如老师提到的toUnion 范型工具,就无法反推,但其中老师把内置的Partial也归类到求值的范型工具中,但实际仍可反推,是不是说明有些范型工具也是具有一致结构的呢?

    作者回复: 你的理解是正确的,这也是做这种分类的主要目的和依赖。另外补充一点,“泛型声明”其实是静态声明,与传统的C++中的“模板(泛型)”在语义上是一致的,这是它能反推的根本原因。 泛型工具中的两种分类比较特别,一般的资料中都不这么分的。它们的相同之处在于“求值”,或称为计算的、动态的。我是为了后面讲其它类型的方便而把它们分成声明与转换的两类。声明性的泛型工具返回的结果与它声明的类型一致,这样也就可以反推了(例如Record)。这一点我觉得你也注意到了。 至于Partial主要是它不是一个“已有的类型概念”,所以没分到声明中,同样的还有Required和Readonly。事实上,在语义上它更像一个修饰词,例如: ``` type PartialRecord<T, R> = Partial<Record<T, R>>; ``` 是“声明一个类型”,还是“对类型加以计算”,才是分类的关键。有些东西正好在这二者的边界上,就比较模糊。Partial<X>是“声明了X成员的可选性质”,还是“对X的性质施加了计算”呢?都对呵,视角不同呵。

    
    