class类的学习

文章介绍了TypeScript中类的属性定义方式,包括在构造函数中赋值和通过构造函数参数直接定义公共属性。同时,详细阐述了函数重载的概念,包括函数签名、规则1至6,强调了调用时根据参数判断重载函数以及返回值类型的处理。
摘要由CSDN通过智能技术生成

(1)TS 类有多种定义属性的方式,如下:

方式 1:先在类中定义属性然后在构造函数中通过 this 赋值;

//  姓名,年龄,地址,身份证号码,联系方式,家庭地址,微信号
class Person {//属性

  //public  name:string |undefined//typescript4.0之前属性如果没有赋值的解决方法 增加一个undefined数据类型
  // 类上定义的属性一定是描绘这个类本身特征的变量,不能把一些无关的变量定义成类属性
  public name: string = "noname"
  public age: number = 0
  public phone: string = "11111"
  public friends: Array<string> = ["df","df"]
  // 对象的变量=实例的变量=类的【非静态的】属性=简称属性
  //name、age等叫实例属性或者对象属性

  constructor(name_: string, age_: number, phone_: string) {//构造器
    this.name = name_;
    this.age = age_;
    this.phone = phone_;
  }

  //function  错误,类中定义方法不能用function

  public doEat(who: string, address: string): void {//方法默认的返回值为void
    console.log(`${this.name}和${who}吃饭,在${address}吃饭`);
  }
}
//let zhangSanPerson = new Person();
//给对象赋值的两种方式
// 方法1:通过类中属性或者方法来赋值 get/set选择器
// zhangSanPerson.name = "zhangSan"
// zhangSanPerson.age = 23
// zhangSanPerson.phone = "134123123"
// zhangSanPerson.doEat("李四", "王府井")

// 方法2: 通过构造函数 【构造器】来赋值
// 创建对象一共做了三件事
// 第一件事: 在堆中为类的某个对象【实例】分配一个空间
// 第二件事:调用对应的构造函数【构造器】并且把构造器中的各个参数值赋值给对象属性
//   new Person()自动匹配无参数的构造器
// 第三件事:把对象赋值给对象变量 【把实例赋值给实例变量】(右边赋值给左边)
let zhangSanPerson = new Person("zhangSan", 23, "134123123"); 
//zhangSanPerson 是对象变量
zhangSanPerson.doEat("李四", "王府井")

console.log(zhangSanPerson)

方式 2:构造函数直接为参数增加 public,给构造器的参数如果加上 public,这个参数就变成了一个属性,默认构造函数会给这个属性赋值 [隐式操作],以上节课的 Order 类为例,具体代码如下:

class Order {
    constructor(public orderId: number, public date: Date,
        public custname: string,public phone: string, 
        public orderDetailArray: Array<OrderDetail>) {
        // 无需this赋值
     }
     ......
 }    

let 对象变量名= new 类名()
const 对象变量名= new 类名()

let  kateCust=new Customer()   
/* kateCust 是对象变量名 ,new Customer()  表示 new 出来的是一个Customer对象,
而且是运行期间才在堆中分配 Customer 对象的内存空间 
【 new  就是分配内存空间的意思】 */

TS 的函数重载比较特殊,和很多其他后端语言的方法重载相比,多了不少规则。学习函数重载,先要了解什么是函数签名,定义如下:

**函数签名** [ function signature ]:函数签名=函数名称+函数参数+函数参数类型+返回值类型四者合成。在 TS 函数重载中,包含了实现签名和重载签名,实现签名是一种函数签名,重载签名也是一种函数签名。

关于函数重载的定义,我们先来看一个很多其他资料提供的不完整且模糊的TS函数重载定义:

**不完整模糊的 TS 函数重载定义**:一组具有相同名字,不同参数列表的和返回值无关的函数 。

**完整的函数重载定义**:包含了以下规则的一组函数就是TS函数重载 【规则内容多,大家要多记,多实践方可】

**规则1:**由一个实现签名+ 一个或多个重载签名合成。

**规则2:** 但外部调用函数重载定义的函数时,只能调用重载签名,不能调用实现签名,这看似矛盾的规则,其实 是TS 的规定:实现签名下的函数体是给重载签名编写的,实现签名只是在定义时起到了统领所有重载签名的作用,在执行调用时就看不到实现签名了。

**规则3:**调用重载函数时,会根据传递的参数来判断你调用的是哪一个函数

**规则4:**  只有一个函数体,只有实现签名配备了函数体,所有的重载签名都只有签名,没有配备函数体。

**规则5:  关于参数类型规则完整总结如下:**

实现签名参数个数可以少于重载签名的参数个数,但实现签名如果准备包含重载签名的某个位置的参数 ,那实现签名就必须兼容所有重载签名该位置的参数类型【联合类型或 any 或 unknown 类型的一种】。

**规则6: 关于重载签名和实现签名的返回值类型规则完整总结如下:**

必须给重载签名提供返回值类型,TS 无法默认推导。

提供给重载签名的返回值类型不一定为其执行时的真实返回值类型,可以为重载签名提供真实返回值类型,也可以提供  void 或 unknown 或 any 类型,如果重载签名的返回值类型是 void 或 unknown 或 any 类型,那么将由实现签名来决定重载签名执行时的真实返回值类型。 当然为了调用时能有自动提示+可读性更好+避免可能出现了类型强制转换,强烈建议为重载签名提供真实返回值类型。

不管重载签名返回值类型是何种类型【包括后面讲的泛型类型】,实现签名都可以返回 any 类型 或 unknown类型,当然一般我们两者都不选择,让 TS 默认为实现签名自动推导返回值类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值