• TypeScript 函数与以及类的使用


    一、函数

    1、函数的基本使用

    介绍

    函数是JavaScript应用程序的基础。它帮助你实现抽象层,模拟类,信息隐藏和模块。在TypeScript里,虽然已经支持类,命名空间和模块,但函数仍然是主要的定义行为的地方。TypeScript为JavaScript函数添加了额外的功能,让我们可以更容易地使用

    函数定义的方式:function function_name(){}

    1. export default {}
    2. // 匿名函数
    3. const sum1=function(a:number,b:number):number{
    4. return a+b
    5. }
    6. let res1=sum1(45,98)
    7. console.log(res1);
    8. // 有名函数 | 命名函数 | 普通函数
    9. function sum2(x:number,y:number):number{
    10. return x
    11. }
    12. let res2=sum2(1,2)
    13. console.log(res2);
    14. // 箭头函数
    15. const seeTv=(time:number):void => {
    16. console.log(`我每天看电视剧${time}个小时`);
    17. }
    18. seeTv(2)
    19. // 简写
    20. // const seeTv=(time:number):void => console.log(`我每天看电视剧${time}个小时`);
    21. // 接口函数
    22. // type 定义别名
    23. type myFun=(x1:number,y1:number) => number
    24. let myfun:myFun=(c:number,d:number) => c+d

    2、函数参数的处理

    可选参数:

    TypeScript函数里,如果我们定义了参数,则我们必须传入这些参数,除非将这些参数设置为可选,可选参数使用问号标识?

    默认参数:

    我们也可以设置参数的默认值,这样在调用函数的时候,如果不传入该参数的值,则使用默认参数,语法格式为``

    function function_name(param1[:type] , param2[:type] = default_value){}

    剩余参数:

    有一种情况,我们不知道要向函数传入多少个参数,这时候我们就可以使用剩余参数来定义。剩余参数语法允许我们将一个不确定数量的参数作为一个数组传入。...args:any[]

    1. export default {}
    2. // 可选参数
    3. const fun1:(x:number,y?:number)=>number=(a:number,b?:number)=>{
    4. return a
    5. }
    6. let res1=fun1(10,20);
    7. console.log(res1);
    8. const fun2:(x:number,y?:number)=>number=function(a,b){
    9. return a
    10. }
    11. const fun3=function(a:number,b?:number){
    12. return a
    13. }
    14. fun3(10)
    15. fun3(10,20)
    16. fun3(10,undefined)
    17. // console.log(fun3);
    18. // 参数的默认值
    19. const fun4=function(a:number,b:number,c:number=3){
    20. return a+b+c
    21. }
    22. fun4(1,2)//1,2,3
    23. fun4(12,65,84)//12,65,84
    24. const fun5=function(a:number=100,b:number=200,c:number=300){
    25. return a+b+c
    26. }
    27. fun5()//100,200,300
    28. fun5(1,2)//1,2,300
    29. // 函数的剩余参数
    30. const fun6=function(...rest:any[]){
    31. console.log(rest);
    32. }
    33. fun6('杨幂',10,true)
    34. const fun7=function(a:number,b:string,...rest:any[]){
    35. console.log(a);
    36. console.log(b);
    37. console.log(rest);
    38. }
    39. fun7(10,'杨幂',true,'迪丽热巴',18)

    3、构造函数

    TypeScript 也支持使用JavaScript内置的构造函数 Function()来定义函数:

    语法格式如下:

    var res = new Function ([arg1[,arg2[,...argN]],] functionBody)

    参数说明:

    •  arg1, arg2, ... argN:参数列表
    •  functionBody:一个含有包括函数定义的JavaScript 语句的字符串。
    1. export default {}
    2. // 构造函数
    3. var myfun=new Function('a','b','return a*b');
    4. console.log(myfun(10,20));

    4、函数重载

    重载是巧法名字相同,而参数不同,返回类型可以相同也可以不同。

    每个重载的方法(或者构造函数〕都必须有一个独一无二的参数类型列表。

    参数类型不同:

    • function disp(string) :void;
    • function disp (number) : void;

    参数数量不同:

    • function disp(n:number) : void;
    • function disp(x:number , y:number): void;

    参数类型顺序不同:

    • function disp(n: number ,s;string): void;
    • function disp(s :string,n : number : void;

    如果参数类型不同,则参数类型应设置为any

    参数数呈不同你可以将不同的参数设置为可选。

    1. export default {}
    2. // 不使用函数重载的问题
    3. function add1(a:number,b:number){
    4. return a+b
    5. }
    6. add1(10,20)
    7. function add2(a:string,b:string){
    8. return a+b
    9. }
    10. add2('我的名字叫做:','迪丽热巴')
    11. function add3(a:string|number,b:string|number){
    12. if(typeof a =='number' && typeof b =='number'){
    13. return a+b
    14. }else if(typeof a =='string' && typeof b =='string'){
    15. return a+b
    16. }else if(typeof a =='number' && typeof b =='string'){
    17. return a+b
    18. }else if(typeof a =='string' && typeof b =='number'){
    19. return a+b
    20. }
    21. }
    22. add3('我的名字叫做:','迪丽热巴')
    23. add3(10,15)
    24. add3(10,'杨幂')
    25. add3('白鹿',19)
    26. // 定义函数重载
    27. function addFun(a:number,b:number):number;
    28. function addFun(a:string,b:string):string;
    29. function addFun(a:string,b:number):string;
    30. function addFun(a:number,b:string):string;
    31. // 使用函数重载
    32. function addFun(a:any,b:any):any{
    33. return a+b
    34. }
    35. addFun(10,20)
    36. addFun('我的名字叫做:','迪丽热巴')
    37. addFun('蔡徐坤',20)
    38. addFun(10,'赵金麦')
    39. // 定义参数类型与参数数量不同
    40. function star(a:string):string
    41. function star(a:number,b:string):void
    42. function star(a:any,b?:any):any{
    43. console.log(a+b);
    44. }
    45. star('杨幂')
    46. star(12,'白鹿')
    47. // star(10)

    二、类的使用

    1、类的基本使用

    定义:

    • TypeScript是面向对象的JavaScript。
    • 类描述了所创建的对象共同的属性和方法。
    • TypeScript支持面向对象的所有特性,比如类、接口等。

    TypeScript类定义方式如下: class class_name {}

    定义类的关键字为class,后面紧跟类名,类可以包含以下几个模块((类的数据成员)∶

    • 字段  字段是类里面声明的变量。字段表示对象的有关数据。
    • 构造函数  类实例化时调用,可以为类的对象分配内存。
    • 方法  方法为对象要执行的操作。
    1. export default {}
    2. class Person{
    3. // name:string='杨幂'//初始化表达式
    4. // 注意点:需要先定义实例属性,才能使用
    5. // 字段(属性)
    6. name:string
    7. age:number
    8. // 构造函数
    9. constructor(name:string,age:number){
    10. // this指的是外面的name与age
    11. this.name=name
    12. this.age=age
    13. }
    14. // 函数(方法)
    15. sayHello():void{
    16. console.log(`我叫${this.name},今天${this.age}岁了`);
    17. }
    18. }
    19. let p = new Person('赵金麦',21)
    20. p.sayHello()

    2、类的继承

    TypeScript支持继承类,即我们可以在创建类的时候继承一个已存在的类,这个已存在的类称为少类,继承它的类称为了类。

    类继承使用关键字extends,子类除了不能继承父类的私有成员(方法和属性)和构造函数,其他的都可以继承。

    Typescript一次只能继承一个类,不支持继承多个类,但TypeScript支持多重继承(A继承B,B继承C)。

    语法格式如下:c1ass child_class_name extends parent_class_name

    1. export default {}
    2. class Person{
    3. // 字段(属性)
    4. name:string
    5. age:number
    6. // 构造函数
    7. constructor(name:string,age:number){
    8. this.name=name
    9. this.age=age
    10. }
    11. // 函数(方法)
    12. sayHello():void{
    13. console.log(`我的女神是${this.name},她今年${this.age}岁了,在我心中她永远18岁!`);
    14. }
    15. }
    16. // extends 继承
    17. class Student extends Person{
    18. score:string
    19. constructor(name:string,age:number,score:string){
    20. // 调用父级中的构造函数
    21. super(name,age)
    22. this.score=score
    23. }
    24. sayHello(): void {
    25. // 调用父级的函数
    26. super.sayHello()
    27. console.log(`我是重写之后的,我叫${this.name},今年${this.age}岁了,我的成绩是${this.score}等级`);
    28. }
    29. }
    30. let p = new Student('鞠婧祎',18,'A')
    31. p.sayHello()

    3、static与instanceof

    1. export default {}
    2. // static 关键字用于定义类的数据成员(属性和方法)为静态的,静态成员可以直接通过类名调用。
    3. class StaticTest{
    4. static salary:number
    5. static say():void{
    6. console.log(`我们想要的工资是:${StaticTest.salary}k`);
    7. }
    8. }
    9. StaticTest.salary=18
    10. StaticTest.say()
    11. // instanceof运算符用于判断对象是否是指定的类型,如果是返回true,否则返回false。
    12. class Person{}
    13. let p = new Person()
    14. let isPerson = p instanceof Person
    15. console.log(`p 对象是 Person 类实例化来的吗?${isPerson}`);//true
    16. // 继承
    17. class Student extends Person{}
    18. let s = new Person()
    19. let isStudent = s instanceof Person
    20. console.log(`s 对象是 Person 类实例化来的吗?${isStudent}`);//true

    4、类中的修饰符

    1. export default {}
    2. /**
    3. * public(默认):公有,可以在任何地方被访问
    4. * protected:受保护,可以被其自身以及其子类访问
    5. * private:私有,只能被其定义所在的类访问
    6. * readonly:可以使用readonly关键字将属性设置为只读的。只读属性必须在声明时或构造函数里被初始化。
    7. */
    8. class Person{
    9. public name:string
    10. protected age:number
    11. private sex:string
    12. constructor(name:string,age:number,sex:string){
    13. this.name = name
    14. this.age = age
    15. this.sex = sex
    16. }
    17. say():void{
    18. console.log(`我的名字是${this.name},性别为${this.sex},今年${this.age}岁了`);
    19. }
    20. }
    21. class Student extends Person{
    22. score:string
    23. constructor(name:string,age:number,sex:string,score:string){
    24. super(name,age,sex)
    25. this.score = score
    26. }
    27. say():void{
    28. console.log(this.name);
    29. console.log(this.age);
    30. // console.log(this.sex);//私有
    31. console.log(this.score);
    32. }
    33. }
    34. let s = new Student('林志颖',18,'男','A')
    35. s.say()
    36. // 只读 readonly
    37. class Print{
    38. readonly str1:string = 'HTML'
    39. readonly str2:string
    40. readonly str3:string
    41. readonly str4:string
    42. constructor(str1:string,str2:string,str3:string,str4:string){
    43. this.str2 = str2
    44. this.str3 = str3
    45. this.str4 = str4
    46. }
    47. // show():void{
    48. // this.str2='js'
    49. // }
    50. }
    51. let p = new Print('JavaScript','jQuery','Bootstrap','TypeScript')
    52. console.log(p);

    5、getter与setter

    官方的另外一个名字:存取器

    通过getters/setlers来载取对对象成员的访问

    注意点:

    如果存在get ,但没有set ,则该属性自动是只读的

    如果没有指定setter参数的类型,它将从getter的返回类型中推断出来

    访问器和设置器必须有相同的成员可见性

    1. export default {}
    2. class MyName{
    3. private _fullName:string='白鹿'
    4. // 读取字段的值
    5. get fullName(){
    6. console.log('get被调用了');
    7. return this._fullName
    8. }
    9. // 为字段赋值
    10. set fullName(newName:string){
    11. console.log('set被调用了');
    12. this._fullName = newName
    13. }
    14. }
    15. let m = new MyName()
    16. m.fullName='虞书欣';//赋值
    17. console.log(m);
    18. console.log(m.fullName);//取值

    6、抽象类

    定义

    • 抽象类做为其它派生类的基类使用。它们一般不会直接被实例l化
    • 抽象类是专门用于定义哪些不希望被外界直接创建的类的
    • 抽象类和接口一样用于约束子类

    抽象类和接口区别

    • 抽象方法必须包含 abstract 关键亨并且可以包含访问修饰符
    • 接口中只能定义约束,不能定义具体实现。而抽象类中既可以定义约束,又可以定义具体实现
    1. export default {}
    2. abstract class Person{
    3. abstract name:string
    4. abstract age:number
    5. abstract show():string
    6. showName():void{
    7. console.log('Hello World');
    8. }
    9. }
    10. class Student extends Person{
    11. name: string='杨颖'
    12. age:number=18
    13. show(){
    14. return '奔跑吧兄弟'
    15. }
    16. }
    17. // 抽象类不会被直接实例化
    18. // let p = new Person()
    19. let s = new Student()
    20. let res = s.show()
    21. console.log(res);

    7、类的初始化顺序

    • 基类的字段被初始化
    • 基类构造函数运行
    • 子类的字段被初始化
    • 子类构造函数运行
    1. export default {}
    2. class Old{
    3. name:string='李易峰'
    4. constructor(){
    5. console.log(`我是${this.name},我主演了古剑奇谭`);
    6. }
    7. }
    8. class Young extends Old{
    9. name: string='赵露思'
    10. constructor(){
    11. super()
    12. console.log(`我是${this.name},我主演了星汉灿烂`);
    13. }
    14. }
    15. let y = new Young()
  • 相关阅读:
    【快手小玩法-弹幕游戏】开发者功能测试报告提交模板
    【C++ 科学计算】C++ 预测算法之多项式曲线拟合
    系统告警 ProcessUnpackaged is set to ‘no‘
    【Putty】win10 / win 11:SSH 远程连接工具 Putty 下载、安装
    一封来自江苏省电力设计院的表扬信
    git清除所有历史commit
    两年Java开发工作经验面试总结
    商城小程序功能
    【WLAN】Android 13 WIFI 选网机制--NetworkNominator 解读
    【操作系统】第2章 进程与线程
  • 原文地址:https://blog.csdn.net/m0_61843988/article/details/126769995