TypeScript的官方文档已经更新了,但是我能找到的中文文档还是旧版本。因此,对一些新增和修改的章节进行了翻译和整理。本文翻译自TypeScriptHandbook中的“MappedTypes”一章。本文并没有严格按照原文翻译,部分内容也做了说明和补充。映射类型(MappedTypes)有时,一种类型需要基于另一种类型,但又不想复制一份。这时候可以考虑使用映射类型。映射类型基于索引签名的语法。先回顾一下索引签名://当需要提前声明属性的类型时typeOnlyBoolsAndHorses={[key:string]:boolean|马;};const符合:OnlyBoolsAndHorses={del:true,rodney:false,};而映射类型是使用PropertyKeys联合类型的泛型,其中PropertyKeys大多是通过keyof创建的,然后循环遍历键名创建类型:typeOptionsFlags={[PropertyinkeyofType]:boolean;};本例中,OptionsFlags会遍历Type的所有属性,然后设置为Boolean类型。类型FeatureFlags={darkMode:()=>void;newUserProfile:()=>void;};typeFeatureOptions=OptionsFlags;//typeFeatureOptions={//darkMode:boolean;//newUserProfile:boolean;//}映射修饰符(MappingModifiers)在使用映射类型时,有两个额外的修饰符可以使用,一个是readonly,用于设置属性为只读,另一个是?,用于设置属性为可选。您可以通过前缀-或+来删除或添加这些修饰符。如果不写前缀,就相当于用了+前缀。//删除属性类型中的只读属性CreateMutable={-readonly[PropertyinkeyofType]:Type[Property];};输入LockedAccount={只读ID:字符串;只读名称:字符串;};typeUnlockedAccount=CreateMutable;//typeUnlockedAccount={//id:string;//name:string;//}//删除属性类型中的可选属性Concrete={[PropertyinkeyofType]-?:类型[属性];};输入MaybeUser={id:string;名称?:字符串;年龄?:数字;};typeUser=Concrete;//typeUser={//id:string;//name:string;//age:number;//}KeyRemappingviaas(KeyRemappingviaas)在TypeScript4.1及更高版本中,可以使用映射类型中的as语句实现键名重映射:根据之前的属性名称创建一个新的属性名称:接口人{名称:细绳;年龄:数字;location:string;}typeLazyPerson=Getters;//typeLazyPerson={//getName:()=>string;//getAge:()=>number;//getLocation:()=>string;//}你也可以使用条件类型返回一个never来过滤掉某些属性://Removethe'kind'propertytypeRemoveKindField={[PropertyinkeyofTypeasExclude]:Type[财产]};界面圆{种类:“圆”;radius:number;}typeKindlessCircle=RemoveKindField;//typeKindlessCircle={//radius:number;//}你还可以遍历任何联合类型,而不仅仅是字符串|编号|符号,可以是任何联合类型:typeEventConfig={[EinEventsasE["kind"]]:(event:E)=>void;}typeSquareEvent={kind:"square",x:number,y:number};typeCircleEvent={kind:"circle",radius:number};复制代码类型Config=EventConfig//typeConfig={//square:(event:SquareEvent)=>void;//circle:(event:CircleEvent)=>void;//}进一步探索(FurtherExploration)映射类型也可以和其他函数结合使用,比如这是一个使用条件类型的映射类型,它将基于在对象上是否有返回true或false的pii属性:typeExtractPII={[PropertyinkeyofType]:Type[Property]extends{pii:true}?真假;};类型DBFields={id:{格式:"递增"};名称:{类型:字符串;pii:真};};typeObjectsNeedingGDPRDeletion=ExtractPII;//typeObjectsNeedingGDPRDeletion={//id:false;//name:true;//}TypeScript系列TypeScript系列文章由三部分组成:官方文档的翻译、重要的分析和分析难点、实战技巧,涵盖入门、进阶、实战。旨在为您提供系统的TS学习教程。该系列约有40篇文章。点此浏览全系列文章,建议顺便收藏本站。微信:“mqyqingfeng”,加我到世优唯一的读者群。如有错误或不准确的地方,请务必指正,万分感谢。如果你喜欢或者有启发,欢迎star,这也是对作者的鼓励。