• TypeScript 类的使用、泛型与其他补充类型


    一、类的使用

    1、implements 子句

    • 类可以实现接口,使用关键字 implements
    • 可以使用一个 implements 子句来检查一个类,是否满足了一个特定的接口。如果一个类不能正确地实现它,就会发出一个错误

    注意点:

    实现一个带有可选属性的接口并不能创建该属性

    只要一个接口继承了某个类,那么就会继承这个类中所有的属性和方法,但是只会继承属性和方法的声明,不会继承属性和方法实现

    与 extends 的区别:

    extends:继承某个类,继承之后可以使用父类的方法,也可以重写父类的方法

    implements:继承某个类,必须重写才可以使用

    1. export default {}
    2. interface IPersonInfo{
    3. name:string
    4. age:number
    5. sex?:string
    6. show():void
    7. }
    8. interface IMusic{
    9. music:string
    10. }
    11. class Person implements IPersonInfo,IMusic{
    12. name: string='吴谨言'
    13. age:number=21
    14. // sex:string='女'
    15. music:string='雪落下的声音'
    16. show(){
    17. console.log(`我叫${this.name},是主演延禧攻略的主演,今年${this.age}岁了`);
    18. }
    19. }
    20. let p = new Person()
    21. p.show()
    22. // p.sex='女';//报错
    23. // 注意点:只要一个接口继承了某个类,那么就会继承这个类中所有的属性和方法
    24. // 但是只会继承属性和方法的声明,不会继承属性和方法实现
    25. interface ITest extends Person{
    26. salary:number
    27. }
    28. class Star extends Person implements ITest{
    29. name: string='关晓彤'
    30. age:number=20
    31. salary:number=100000
    32. }
    33. let s = new Star()
    34. console.log(s.name);
    35. console.log(s.salary);

    二、泛型

    1、泛型的基本使用

    • 泛型可以理解为宽泛的类型,通常用于类和函数。使用的时候我们再指定类型
    • ·泛型不仅可以让我们的代码变得更加健壮,还能让我们的代码在变得健壮的同时保持灵活性和可重用性
    • 通过用 来表示,放在参数的前面
    1. export default {}
    2. const arr1:string[]=['李易峰','陈伟霆','杨幂'];
    3. const arr2:Array<string>=['成毅','杨紫']
    4. const arr3:Array<number>=[12,63,23,48]
    5. // 不使用泛型
    6. let getArray = (value:number,item:number):number[]=>{
    7. return new Array(item).fill(value)
    8. }
    9. let arr = getArray(10,3)
    10. // let arr = getArray('zhang',3);//报错
    11. console.log(arr);
    12. let getArray1 = (value:any,item:number):any[]=>{
    13. return new Array(item).fill(value)
    14. }
    15. console.log(getArray1(10,3));
    16. console.log(getArray1('白鹿',3));
    17. // 使用泛型
    18. let getArray2 = (value:T,item:number):T[]=>{
    19. return new Array(item).fill(value)
    20. }
    21. let res = getArray2<string>('鞠婧祎',2)
    22. let res1 = getArray2<number>(2,2)
    23. console.log(res);
    24. console.log(res1);

    2、泛型约束

    • 在TS中,我们需要严格的设置各种类型,我们使用泛型之后,将会变得更加灵活,但同时也将会存在一些问题
    • 我们需要对泛型进行约束来解决这些问题
    1. export default {}
    2. // 演示可能出现的问题
    3. // function getLength(arr:T):T{
    4. // console.log(arr.length);
    5. // return arr
    6. // }
    7. // 通用方法
    8. function getLength(arr:Array):Array{
    9. console.log(arr.length);
    10. return arr
    11. }
    12. getLength([1,2,3])
    13. getLength(['赵丽颖','迪丽热巴','杨幂'])
    14. // getLength('刘亦菲');//报错
    15. // 泛型接口
    16. interface ILength{
    17. length:number
    18. }
    19. function getLengthsextends ILength>(arr:T):number{
    20. return arr.length
    21. }
    22. getLengths([1,2,3])
    23. getLengths(['赵丽颖','迪丽热巴','杨幂'])
    24. getLengths('刘亦菲')

    3、泛型接口

    • 将泛型与接口结合起来使用,可以大大简化我们的代码,增加我们的代码可读性
    • 泛型也可以使用默认值
    1. export default {}
    2. interface IPerson{
    3. name:string
    4. sex:string
    5. }
    6. let p:IPerson={
    7. name:'李易峰',
    8. sex:'男'
    9. }
    10. interface IPersons{
    11. name:T1
    12. sex:T2
    13. }
    14. let ps:IPersons<string,number>={
    15. name:'杨幂',
    16. sex:0
    17. }
    18. interface IPersosstring,T2=string>{
    19. name:T1
    20. sex:T2
    21. }
    22. let pi:IPersos={
    23. name:'蔡徐坤',
    24. sex:'男'
    25. }

    4、泛型类

    • 泛型类看上去与泛型接口差不多。泛型类使用(<>)括起泛型类型,跟在类名后面。
    1. export default {}
    2. // 泛型类使用<>括起泛型类型,跟在类名后面
    3. class Person<T1,T2>{
    4. name:T1
    5. age:T2
    6. sex:T1
    7. constructor(name:T1,age:T2,sex:T1){
    8. this.name=name
    9. this.age=age
    10. this.sex=sex
    11. }
    12. }
    13. const p1 = new Person('白鹿',18,'女')
    14. const p2 = new Person<string,number>('迪丽热巴',18,'女')
    15. const p3:Person<string,number>=new Person('白鹿',18,'女')

    三、其他补充类型

    1、unknown类型

    •  unknown类型代表任何值。这与any类型类似,但更安全,因为对未知unknown值做任何事情都是不合法的。
    • unknown类型被称作安全的any
    1. export default {}
    2. // 1.任何类型都可以赋值给unknown类型
    3. let str:unknown
    4. str=18
    5. str=true
    6. str='范冰冰'
    7. // 2.不能将unknown类型赋值给其他类型
    8. let val:unknown=18;
    9. let num:number;
    10. // num=val;//报错
    11. // 使用类型断言
    12. num = val as number;
    13. // 使用类型缩小
    14. if(typeof val == 'number'){
    15. num=val
    16. }
    17. // 3.unknown与其它任何类型组成的交叉类型最后都是其他类型
    18. type MyType1 = number & unknown;
    19. type MyType2 = unknown & boolean;
    20. let a:MyType1 = 18;
    21. let b:MyType2 = true;
    22. // 4.unknown除了与any以外,与其它任何类型组成的联合类型最后都是unknown类型
    23. type MyType3 = unknown | any;
    24. type MyType4 = unknown | number;
    25. type MyType5 = boolean | unknown;
    26. type MyType6 = unknown | string | boolean;
    27. // 5.never类型是unknown类型的子类型
    28. type MyType7 = never extends unknown ? true :false;

    2、Map类型

    Map 对象保存键值对,并且能够记;住键的原始插入顺序。

    任何值(对象或者原始值)都可以作为一个键或一个值。

    Map 是ES6中引入的一种新的数据结构

    可以使用for of进行迭代

    创建Map:

    let myMap = new Map();

    Map相关的函数与属性:

    • map.clear() 移除 Map对象的所有键/值对。
    • map.set() 设置键值对,返回该Map对象。
    • map.get() 返回键对应的值,如果不存在,则返回undefined。
    • map.has() 返回一个布尔值,用于判断 Map中是否包含键对应的值。
    • map.delete() 删除Map中的元素,删除成功返回true,失败返回false。
    • map.size() 返回Map 对象键/值对的数量。
    • map.keys() 返回一个Iterator对象,包含了Map对象中每个元素的键。
    • map.values() 返回一个新的lterator对象,包含了Map对象中每个元素的值。
    1. export default {}
    2. // 创建Map对象
    3. let myMap = new Map()
    4. // 设置Map对象
    5. myMap.set('李易峰',1)
    6. myMap.set('陈伟霆',2)
    7. myMap.set('黄明昊',3)
    8. // 获取键对应的值
    9. console.log(myMap.get('李易峰'));//1
    10. console.log(myMap.get('唐嫣'));//因为不存在,所以是undefined
    11. // 判断Map中是否包含键对应的值
    12. console.log(myMap.has('黄明昊'));//true
    13. console.log(myMap.has('虞书欣'));//false
    14. // 返回Map对象键/值的对应的数量
    15. console.log(myMap.size);//3
    16. // 删除
    17. // console.log(myMap.delete('李易峰'));//true
    18. console.log(myMap.delete('李易峰11'));//false
    19. // 移除Map对象的所有键/值对
    20. // myMap.clear()
    21. // console.log(myMap);
    22. // 迭代Map中的key
    23. for(let key of myMap.keys()){
    24. console.log(key);
    25. }
    26. // 迭代Map中的value
    27. for(let value of myMap.values()){
    28. console.log(value);
    29. }
    30. // 迭代Map中的key => value
    31. for(let entry of myMap.entries()){
    32. console.log(entry);
    33. }
    34. // 使用对象解析
    35. for (let [key,value] of myMap) {
    36. console.log(key,value);
    37. }

    3、条件类型

    • 条件类型的形式看起来有点像JavaScript中的条件表达式
    • T extends U ? TrueType : FalseType
    • 应用场景:解决函数重载问题
    1. export default {}
    2. // 复习三元运算符 x=y?a:b
    3. let score=56
    4. let result=''
    5. result=score>=60?'及格':'不及格'
    6. console.log(result);
    7. // 条件类型
    8. type MyType=T extends string ? string :any;
    9. type res = MyType<string>
    10. interface IName{
    11. name:string
    12. }
    13. interface IAge{
    14. age:number
    15. }
    16. type Condition=T extends string ? IName :IAge;
    17. function reLoadextends number | string>(idOrName:T):Condition{
    18. throw "";
    19. }
    20. reLoad(19)
    21. reLoad('bobo')

    4、映射类型

    • 当你不想重复定义类型,一个类型可以以另一个类型为基础创建新类型。通俗的说就是,以一个类型为基础,根据它推断出新的类型
    • Readonly : Partial关键字
    • Record : Pick 映射类型
    • Readonly,Partial和Pick是同态的,但Record不是。因为Record并不需要输入类型来拷贝属性,所以它不属于同态
    1. export default {}
    2. // Record映射类型
    3. //他会将一个类型的所有属性值都映刻到另一个类型上并创造一个新的类型
    4. type Name="person" | "animal";
    5. type Person ={
    6. name:string
    7. age:number
    8. }
    9. type NewType=Record<Name,Person>;
    10. let res:NewType = {
    11. person:{
    12. name:'唐艺昕',
    13. age:18
    14. },
    15. animal:{
    16. name:'云梦',
    17. age:15
    18. }
    19. }
    20. console.log(res);
    21. // Pick映射类型
    22. // 将原有类型中的部分内容映射到新类型中
    23. interface IPerson{
    24. name:string
    25. age:number
    26. }
    27. type MyType = Pick<IPerson,'name'>;
    28. let res1:MyType={
    29. name:'韩雪'
    30. }
    31. console.log(res1);
  • 相关阅读:
    pytorch lightning最简上手
    C#数组
    java基于ssm+vue二手手机销售平台
    举个栗子!Tableau 技巧(259):文本表中省市县数据的灵活逐级下钻「方法一」
    记录jeecgboot中j-vxe-table事件
    推荐系统[八]算法实践总结V0:腾讯音乐全民K歌推荐系统架构及粗排设计
    数据结构 3:链表
    前端中的身份认证
    镜频抑制滤波器对射频接收前端输出噪声的影响
    worthington酶丨worthington酶的特异性和分类
  • 原文地址:https://blog.csdn.net/m0_61843988/article/details/126807535