TS基础2(泛型、枚举、元组)-学习笔记

川长思鸟来 2022-10-19 12:42 265阅读 0赞

文章目录

    • TS基础2(泛型、枚举、元组)-学习笔记
      • 泛型
      • 枚举
      • 元组
      • 例子参考

TS基础2(泛型、枚举、元组)-学习笔记

在这里插入图片描述

泛型

  1. //泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
  2. //<T> 泛型变量T T表示什么?任何类型
  3. function hello<T>(name:T):T{ //hello函数是泛型
  4. return name
  5. };
  6. //hello<string>('abc');
  7. hello<string|number>(123); //定义多个类型
  8. hello(123); //类型推断 编译器会根据传入的参数来自动的判断T的类型
  9. //缺点 只能传string
  10. // function hello2(name:string):string{
  11. // return name
  12. // };
  13. // hello2(123);
  14. //缺点 不确定返回值的类型
  15. function hello3(name:any):any{
  16. return name
  17. };
  18. hello3(123);
  19. //泛型在函数中具体的写法
  20. //函数声明
  21. function f<T>(x:T):T{
  22. return x
  23. };
  24. //函数表达式
  25. let f2 = function<U>(x:U):U{
  26. return x
  27. }
  28. //ES6
  29. let f3 = <U>(x:U):U=>{
  30. return x
  31. }
  32. //限制 参数的属性或方法一定是属于任何类型
  33. function hello4<T>(name:T):number{ //hello函数是泛型
  34. //name 表示是任何类型
  35. return name.length //error T表示为任何类型 也就是name.length是所有类型都支持的属性
  36. };
  37. function hello5<T>(name:T[]):number{ //number[] string[]
  38. //name 数组
  39. return name.length //
  40. };
  41. //hello5<number>([1,2,3])
  42. hello5<string >(['1','2','3'])
  43. //泛型的约束 extends
  44. //<T extends Abc> 泛型T必须符合接口ABC的形状
  45. interface LengthN{
  46. length:number
  47. }
  48. function hello6<T extends LengthN>(name:T):number{ //hello函数是泛型
  49. //name 必须有length属性的类型
  50. return name.length
  51. };
  52. hello6<string>('222');
  53. //数组泛型 类型+[]
  54. let arr:Array<number> =[1,2,3];
  55. var arr2:number[] = [1,2,3];
  56. //需求 创建一个数组 传入3表示数组的长度为3 具体'x' ['x','x','x']
  57. //createArray(长度,值)
  58. //createArray(5,'a') ['a','a','a','a','a']
  59. //createArray(2,3) [3,3]
  60. function createArray(length:number,value:any):Array<any>{
  61. var arr = [];
  62. for(let i=0;i<length;i++){
  63. arr[i] = value
  64. };
  65. return arr;
  66. };
  67. createArray(5,'a') ;
  68. function createArray2<T>(length:number,value:T):Array<T>{
  69. var arr = [];
  70. for(let i=0;i<length;i++){
  71. arr[i] = value
  72. };
  73. return arr;
  74. };
  75. createArray2<number>(5,3) ;
  76. //多个类型参数
  77. function f6<N,S>(a:[N,S]):[S,N]{
  78. return [a[1],a[0]]
  79. };
  80. f6<number,string>([1,'a'])
  81. //泛型在类中的运用
  82. class A2<T>{
  83. n:T;
  84. constructor(num:T){
  85. this.n = num
  86. }
  87. action(x:T):T{
  88. return x
  89. }
  90. };
  91. var a2 = new A2<number>(1);

枚举

  1. //枚举 enum类型是对JavaScript标准数据类型的一个补充
  2. var arr7 = ['a','b','c'];
  3. arr7['a'] //不能通过键来获取,只能索引
  4. var obj = { a:1,b:2};
  5. obj[1] //不能通过索引取值
  6. enum Color { red,green,blue,'a','b','c'};
  7. var c:Color= Color.red //0 通过键取值
  8. var c2:string = Color[1] //green 通过索引取值
  9. //改变索引值
  10. enum Color2 { red=10,green,blue};
  11. var c3:Color2= Color2.green //11
  12. //手动设置
  13. enum Color3 { red=30.7,green=20,blue=10};
  14. var c4:Color3= Color3.green //20
  15. //任意值
  16. var c11 = 'hello';
  17. enum Color4 { red=30.7,green=<any>c11,blue=c11.length};
  18. var c5:Color4= Color4.green //hello

元组

  1. //元组 数组合并了相同类型的对象,而元组(Tuple)合并了不同类型的对象。
  2. //数组
  3. var lists:number[] = [1,2,3,4,5];
  4. var lists2:Array<string> = ['1','2'];
  5. var lists3:Array<any> = ['1','2',true,1,2];
  6. var t:[number,string] = [10,'a']; //元组允许一个数组中可以有多个不同的类型 一一匹配

例子参考

  1. //档位
  2. enum Gear {
  3. First=1, Second=3, Third=5
  4. }
  5. enum Color {
  6. White, Red
  7. }
  8. //接口
  9. interface Drivable {
  10. //启动
  11. start(): void;
  12. //驾驶
  13. drive(time: number, speed: Gear): void;
  14. //行驶距离
  15. getKilometer(): number
  16. }
  17. //定义一个抽象的类
  18. //abstract 抽象的类 没有实现 不可被实例化
  19. //定义动物类
  20. // abstract class Animal {
  21. // abstract eat():void; //抽象类的子类必须实现抽象类的抽象方法
  22. // }
  23. // //var a = new Animal(); //error 用到了abstract修饰符,不能被实例化
  24. // class Dog extends Animal{
  25. // constructor(){
  26. // super();
  27. // }
  28. // //抽象类的子类必须实现抽象类的抽象方法
  29. // eat(){
  30. // }
  31. // }
  32. abstract class Car implements Drivable { //定义一个抽象类 来实现Drivable接口
  33. protected _isRunning: boolean; //只能被子类访问的属性
  34. protected _distanceFromStart: number; //只能被子类访问的属性
  35. constructor() {
  36. this._isRunning = false;
  37. this._distanceFromStart = 0;
  38. }
  39. public start() { //公共启动汽车
  40. this._isRunning = true;
  41. }
  42. //抽象类的子类必须实现抽象类的抽象方法
  43. abstract drive(time: number, speed: Gear): void;
  44. public getKilometer(): number { //公共行驶距离
  45. return this._distanceFromStart;
  46. }
  47. }
  48. //派生类 子类
  49. class BMW<T extends Color> extends Car {
  50. private color: Color; //私有属性
  51. constructor(T) {
  52. super();
  53. this.color = T;
  54. }
  55. public drive(time: number, speed: Gear): void {
  56. if (this._isRunning) {
  57. this._distanceFromStart += time*speed;//行驶距离
  58. }
  59. }
  60. public getColor(): string {
  61. return Color[this.color]
  62. }
  63. }
  64. let bmw = new BMW(Color.Red);
  65. bmw.start();
  66. bmw.drive(10, Gear.First);
  67. bmw.drive(60, Gear.Third);
  68. document.body.innerHTML = "distance:"+bmw.getKilometer()+',color:'+bmw.getColor()

发表评论

表情:
评论列表 (有 0 条评论,265人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java基础 :内部类、

    泛型提供了在编译阶段 约束所能操作的数据类型,并自动进行检查的能力!这样可以避免强制类型转换,及其可能出现的异常,保证所操作的数据类型的统一。定义类,接口,方法时,声明一...

    相关 TS

    官方定义 使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。 TypeScript支持数字的和基于字符串的枚举。枚举使用 `enu

    相关 TS学习笔记(五):

    泛型是指定一个表示类型的变量,用它来代替某个实际的类型用于编程,而后通过实际调用时传入或推导的类型来对其进行替换,以达到一段使用泛型程序可以实际适应不同类型的目的。为了实现泛型

    相关 学习笔记

    [2019独角兽企业重金招聘Python工程师标准>>> ][2019_Python_] ![hot3.png][] 枚举Enum > 关键字enum可以将一组具名的值

    相关

        泛型:         jdk1.5版本之后出现的新特性,用于解决安全问题,是一个安全机制.         泛型格式;通过<>定义操作的引用数据类型,在jav