首页 > 编程知识 正文

typescript对象类型,typescript高级用法

时间:2023-05-04 11:25:22 阅读:32889 作者:88

第一篇文章是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]};

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。