说明:目前网上还没有最新TypeScript官方文档的中文翻译,所以才有这样的翻译计划。因为本人也是TypeScript的初学者,不能保证翻译100%准确。如有错误,请在评论区指出;翻译内容:暂定翻译内容为TypeScriptHandbook,其他部分翻译文档稍后补充;项目地址:TypeScript-Doc-Zh,如果对你有帮助,可以点个star~本章官方文档地址:MappedTypesMappedtypes有时我们不想重复写代码,这时我们需要基于某种类型创建另一种类型。索引签名用于为未预先声明的属性声明类型,映射类型是根据索引签名的语法构造的。类型OnlyBoolsAndHorses={[key:string]:boolean|马;};const符合:OnlyBoolsAndHorses={del:true,rodney:false,};映射类型也是一个泛型类型,它使用PropertyKey(属性键)Type(通常由keyof创建)的并集遍历所有的key创建一个新的类型:typeOptionsFlags={[PropertyinkeyofType]:布尔值;};在此示例中,OptionsFlags将接受所有属性并将其值更改为布尔值。类型FeatureFlags={darkMode:()=>void;newUserProfile:()=>void;};typeFeatureOptions=OptionsFlags;^/*类型FeatureOptions={darkMode:boolean;新用户配置文件:布尔值;}*/映射修饰在映射时,有两个额外的修饰符可用,分别是readonly和?,分别用于声明属性的只读和可选属性。要删除或添加修饰符,只需在修饰符前加上-或+。如果不加前缀,默认使用+。//移除类型中的只读属性CreateMutable={-readonly[PropertyinkeyofType]:Type[Property];};typeLockedAccount={readonlyid:string;只读名称:字符串;};类型UnlockedAccount=CreateMutable;^/*类型UnlockedAccount={id:string;名称:字符串;}*///去掉类型的可选属性Concrete={[PropertyinkeyofType]-?:Type[Property];}typeMaybeUser={id:string;名称?:字符串;age?:number;};typeUser=Concrete;^/*输入User={id:string;名称:字符串;年龄:数字;}*/通过as实现键重映射在TypeScript4.1或更高版本中,可以在映射类型中使用as子句实现键重映射:typeMappedTypeWithNewProperties={[PropertiesinkeyofTypeasNewKeyType]:Type[Properties]您可以使用模板字面量类型等功能从原始属性名称创建新的属性名称:typeGetters={[PropertyinkeyofTypeas`get${Capitalize}`]:()=>Type[Property]};interfacePerson{name:string;年龄:数字;位置:字符串;}类型LazyPerson=Getters;^/*类型LazyPerson={getName:()=>string;getAge:()=>数字;getLocation:()=>字符串;}*/可以通过条件类型生成never类型来过滤掉某些键://去掉kind属性t??ypeExclude=TextendsU?从不:TtypeRemoveKindField={[属性在keyofTypeasExclude]:Type[Property]};interfaceCircle{kind:'circle';radius:number;}typeKindlessCircle=RemoveKindField;^/*输入KindlessCircle={半径:数字;}*/不仅是字符串|编号|symbol这样的关节类型,可以映射任何关节类型:={kind:'squre',x:number,y:number};典型值eCircleEvent={kind:'circle',radius:number};typeConfig=EventConfig/**typeConfig={square:(event:SqureEvent)=>void;圈子:(事件:CircleEvent)=>无效;}/映射类型的进一步应用映射类型也可以与本章介绍的其他特性(类型操作)结合使用。true属性pii,它将返回true或false:typeExtractPII={[PropertyinkeyofType]:Type[Property]extends{pii:true}?真假};输入DBFileds={id:{format:'incrementing'};名称:{类型:字符串;pii:true};};typeObjectsNeedingGDPRDeletion=ExtractPII;^/*类型ObjectsNeedingGDPRDeletion={id:false;名称:真实;}*/