高质量类型可以提高项目的可维护性并避免一些潜在的错误。一些大厂也在前端面试中考察了TypeScript高级类型的定义。本系列主要解答来自TypeChallenges的TS类型挑战题,从而更好的理解TS的类型系统,编写自己的类型工具。让我们看一个简单的主题:实现Pick。题目描述实现了TS自带的Pick,但是无法使用。从类型T中选择属性K构造一个新类型。例如:interfaceTodo{title:stringdescription:stringcompleted:boolean}typeTodoPreview=MyPickconsttodo:TodoPreview={title:'Cleanroom',completed:false,}QuestionanswerPick类型用于从T类型中选择一些属性K构造一个新的类型。首先,我们需要遍历对象T。然后使用映射类型遍历:typeMappedType={[KeyinkeyofT]:T[Key];};keyofT用于从对象类型T中获取键值key;in用于对象键值key进行迭代;key是对象键值key本身;T[Key]为指定Key的值;那么,如果要迭代获取对象的某个部分,需要指定迭代的key:typeMappedType={[KeyinKeys]:T[Key];};然而,这样写有两个错误:类型“Keys”不可分配给类型“string|number|symbol”。类型“Key”不能用于索引类型“T”。这两个错误都与迭代规则有关:key可以是string、number、symbol;如果T中不存在Key,则无法调用T[Key]。如果规则2成立,则规则1必须成立,因为现有密钥是指定类型之一。为了迭代现有键,我们需要使用extends关键字进行约束。这样,如果你指定了一个不存在的key,TypeScript会报错,如果这个key在T中不存在,你就不能调用T[key]。Pick的实现如下:typeMyPick={[KeysinKeys]:T[Key];};类型挑战:https://github.com/type-challenges/type-challenges