第一篇文章是https://github.com/ust B- musi on/fee-skills
写在前面
在ts中,索引类型和映射类型是比较复杂的内容。 索引类型允许编译器检查使用动态属性名称的代码。 此外,可以使用映射类型将旧类型转换为新类型。 让我在一篇文章中稍微详细介绍这两个概念。
索引类型
在实际开发中,经常会遇到从对象中获取一些属性的值并创建相应的集合的情况。
letperson={
name:'musion ',
age:35
}
functiongetvalues (个人: any,keys:string[] ) )。
returnkeys.map(key=Person[key] )。
}
console.log (获取值(person,['name ',age] ) )//['musion ',35]
console.log (获取值(person,['gender'] ) )//[undefined]
在上面的示例中,可以看到getValues(persion,“gender”)打印为“[undefined]”,但终端服务编译器没有提供错误信息。 那么,如何使用ts对这一模式进行类型约束呢? 这里使用索引类型。 改造getValues函数以通过索引类型查询和索引访问操作符。
功能性getvalues (person : t,keys:K[] ) :T[K][]{
returnkeys.map(key=Person[key];
}
接口人员{
name:斯特林;
age :编号;
}
常数人员:人员={
name:'musion ',
age:35
}
获取值(person,['name'] )//['musion']
获取值(人员,['gender'] )//错误报告:
//argumento ftype ' ' gender ' [] ' isnotassignabletoparameteroftype ' (' name '|' age ' ) [ ] '。
//type ' gender ' isnotassignabletotype ' name '|' age '。
编译器检查传入的值是否是人员的一部分。 介绍几个概念理解上面的代码:
1 .索引类型查询操作符(keyof T ) )。
keyof T的意思表示类型t的所有共同属性的文字的连接类型,在上述例子中,是Person的属性名,即['name ',age]
2 .索引访问操作符(T[K] ) ) )。
T[K]表示对象t的属性k表示的类型,在上述例子中,T[K][]表示变量t取属性k的值的数组
3 .通用约束(K extends T ) )。
通用变量可以通过继承特定类型来获取特定属性
介绍了这三个概念后,上面的代码应该能理解。 首先从泛型来看,这里有t和k两种类型,根据类型估计,第一个参数person是person,类型估计为person。 第二个数组参数的类型估计(K extends keyof T ),关键字keyof可以是t,也就是Person的所有属性名称['name ',' age']。 使用extends关键字时,通用k继承Person的所有属性名称,即['name ',' age']。 这三种特性的组合保证了代码的动态性和准确性,代码提示也为:
获取值(人员,['gender'] )//错误报告:
//argumento ftype ' ' gender ' [] ' isnotassignabletoparameteroftype ' (' name '|' age ' ) [ ] '。
//type ' gender ' isnotassignabletotype ' name '|' age '。
地图类型
一个常见任务是选择每个已知类型的属性。
接口人员隔离区{
名称? 3360斯特林;
age?编号;
}
实例化人员时,不需要为每个属性赋值。 需要只读版本。
接口人员只读{
只读名称:字符串;
自述age : number;
}
这在JavaScript中很常见。 TypeScript提供了一种映射类型,从旧类型创建新类型。 在映射类型中,新类型以相同的形式转换旧类型的每个属性。 TS内置了几种映射类型,实际上是一些语法糖。 在TypeScript包的typescript/lib/lib.es5.d.ts中有定义。 让我举几个例子。
//将传入的属性设置为只读选项
类型就绪={
readonly[PinkeyofT]:T[P];
}
//使传入的属性可选: keyof T获取t的所有属性名称,in进行遍历,将值赋给p,最后T[P]获取相应属性的值。
类型partial={
[PinkeyofT]?T[P];
}
按以下方式使用:
typePersonPartial=Partial;
typeReadonlyPerson=Readonly;
TypeScript内置了只读和分区,因此不需要手动声明实现。 其他常见的内置类型包括:
记录
将k的所有属性的值转换为t型:
typeRecord={[PinK]:T};
挑库
从t中提取一系列k的属性
typePick={[PinK]:T[P]};
要求的
需要传入的属性
typeRequired={[PinkeyofT]-?T[P]};