TypeScript为JavaScript添加静态类型系统。其中,JavaScript中数组、对象等聚合多个元素的类型,对应TypeScript中的索引类型。例如,这是一个索引类型:typeobj={name:string;年龄:数字;gender:boolean;}索引类型可以加修饰符readonly(只读),?(可选):typeobj={readonlyname:string;年龄?:数字;gender:boolean;}我们知道TypeScript支持类型编程,即对类型参数(paradigms)进行各种运算,生成新的类型:typeIsString=Textendsstring?真假;那么对于索引类型,如何进行运算并生成新的类型呢?答案是映射类型。映射类型映射类型用于构造新的索引类型。例如,这个Record类型:typeRecord={[PinK]:T;Record类型构造一个索引类型,其键为stirng或number或symbol,其值为类型T。它是TS内置的高级类型。在构造新索引类型的过程中,还可以添加一些修饰符。例如ReadOnly:typeReadonly={readonly[KeyinkeyofT]:T[Key];}它创建了一个新的索引类型,并对原索引类型的每个属性添加了只读修饰:例如Partial:typePartial={[KeyinkeyofT]?:T[Key]}它创建一个新的索引类型,添加?对原索引类型的各个属性:可以加,当然也可以去掉:removeoptional(?):typeRequired={[KeyinkeyofT]-?:T[Key]}removereadonly:typeNotReadOnly={-readonly[KeyinkeyofT]:T[Key]}在这些例子之后,映射类型可以做什么就很清楚了:映射类型可以生成一个新的索引类型,只读和?修饰符可以在生成过程中添加或删除。内置的Record、ReadOnly、Required、Partial等类型都是映射类型。但是,当前的映射类型仍然存在局限性。索引名称不能修改、过滤等,功能不够强大。如果要实现过滤和转换,就得用到映射类型的重映射。RemappingRemapping就是在索引后面加一个as语句,表示索引转换成什么。它可用于过滤和转换索引类型。例如过滤掉类型为字符串的索引:typeFilterString={[KeyinkeyofTasT[Key]extendsstring?Key:never]:T[Key];}returnnever表示过滤掉,否则保留。也可以转换索引,比如修改索引名,加上get:typeGetters>={[KeyinkeyofTasget${Capitalize}`]:T[Key];}Textendsxxx是对类型参数的约束,表示只能传入该类型。这里的Record类型是生成索引类型,我们上面介绍过,所以TextendsRecord限制这里只能传入索引类型。在as之后是将索引转换成什么。我们在原来的基础上做了修改,增加了get,后面内容的首字母大写。这个Capitalize也是TS的内置类型。效果如下:这两个例子分别说明了重映射as可以用来过滤和转换索引类型,可以对索引类型做更灵活的编程。例如实现key和value的交换:typeFlip>={[KeyinkeyofTas`${T[Key]}`]:Key}支持重映射后,映射类型可以对索引类型做更多的修改。总结TypeScript使用索引类型来表示具有多个元素的聚合类型,例如数组、对象等。TS支持类型编程,即对类型参数进行各种操作并返回新类型。当然也可以对索引类型进行操作,对应的类型就是映射类型。在生成新的索引类型的过程中,映射类型还可以添加或去掉readonly和?的修饰符。内置的Record、Required、Partial和ReadOnly都是映射类型。如果要进一步过滤和转换索引类型,需要使用as的重映射,可以修改索引(当索引为never时,表示索引被过滤掉)。了解如何使用索引类型只是基础知识。了解如何使用映射类型和重映射是高级内容。这部分可以写很多复杂的类型逻辑,属于类型体操的范畴。