TypeScript类的使用

1、类的基本使用

类描述了所创建的对象共同的属性和方法

Typrscript支持面向对象所有特征,比如类、接口等。

Typrscript类定义方法如下:

class class_name{
//类作用域
}

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

字段–字段是类里面声明的变量。字段表示对象的有关数据。

构造函数–类实例化时调用,可以为类的对象分配内存。

方法–方法为对象要执行的揉作。

代码演示:

export default {}
​
// 类的基本使用
class Person {
    // 字段(属性)
    name: string;
    age: number;
    // 构造函数
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
​
    //函数(方法)
    sayHello(): void {
        console.log(`我是来自狗熊岭的${this.name},我今年${this.age}岁了!!!`);
    }
}
// 实例化类
let p0 = new Person("熊二", 18)
p0.sayHello()

2、类的继承

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

类继承使用关键字extends,子类除了不能继承父类的私有成员(方法和属性)和构造函数,其他的都可以继承。 TypeScript一次只能继承一个类,不支持继承多个类,但TypeScript支持多重继承(A继承B,B继承C)。

语法格式如下:

c1ass child_c1ass_name extends parent_class_name

代码演示:

export default {}
​
// 类的继承
class Person {
    // 字段(属性)
    name: string;
    age: number;
    // 构造函数
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
​
    //函数(方法)
    sayHello(): void {
        console.log(`我是来自狗熊岭的${this.name},我今年${this.age}岁了!!!`);
    }
}
// 实例化类
let p0 = new Person("熊二", 18)
p0.sayHello()
​
class Student extends Person {
    score: string;
    constructor(name: string, age: number, score: string) {
        // 调用父类中的构造函数
        super(name, age);
        this.score = score;
    }
    sayHello(): void {
        // 调用父类中的构造函数
        super.sayHello();
        // 重写的父类方法
        console.log(`我是重写的方法,我是来自狗熊岭的${this.name},我今年${this.age}岁了,我的成绩是${this.score}。`)
    }
}
let p1 = new Student("光头强",18,"C")
p1.sayHello();

3 、static与instanceof

slatic关键字用于定义类的数据成员(属性和方法)为静态的,静态成员可以直接通过类名调用。

instanceof运算符用于判断对象是否是指定的类型,如果是返回true,否则返回false。

代码演示:

export default {}
​
​
// slatic关键字用于定义类的数据成员(属性和方法)为静态的,静态成员可以直接通过类名调用。
class StaticTest {
    static salary: number;
    static say(): void {
        console.log(`我们想要的工资是${StaticTest.salary}k`);
    }
}
StaticTest.salary = 100;
StaticTest.say();
​
​
// instanceof运算符用于判断对象是否是指定的类型,如果是返回true,否则返回false。
class Person {};
​
let p0 = new Person();
let isPerson = p0 instanceof Person;
console.log("p0对象是Person实例化出来的吗?",isPerson);//true
​
class Student extends Person{};
​
let p1 = new Student();
let isStudent = p1 instanceof Student;
console.log("p1对象是Person实例化出来的吗?",isStudent);//true

4、类中的修饰符

public(默认):公有,可以在任何地方被访问,

protected:受保护,可以被其自身以及其子类访问,

private:私有,只能被其定义所在的类访问。

readonly:可以使用readonly关键字将属性设置为只读的。只读属性必须在声明时或构造函数里被初始化。

代码演示:

export default {}
​
class Person {
    public name: string;//公有属性
    protected age: number;//受保护
    private sex: string;//私有属性
​
    say(): void {
        console.log(`我的名字是${this.name},性别${this.sex},今年${this.age}岁了}`);
    }
}
​
class Student extends Person {
    score: string;
    constructor(name: string, age: number, sex: string, score: string) {
        super();
        this.name = name;
        this.score = this.score;
    }
    say(): void {
        console.log(this.name);
        console.log(this.age);
        // console.log(this.sex);//属性"sex”为私有属性,只能在类"Person”中访问。
        console.log(this.score);
​
    }
}
​
//readonly:可以使用readonly关键字将属性设置为只读的。只读属性必须在声明时或构造函数里被初始化。
​
class Print {
    readonly str1: string = "我是声名时赋值的";
    readonly str2: string;
    readonly str3: string;
    readonly str4: string;
    readonly str5: string;
​
    constructor( str2: string, str3: string, str4: string, str5: string) {
        this.str2 = str2;
        this.str3 = str3;
        this.str4 = str4;
        this.str5 = str5;
    }
    say() {
        console.log(this.str1,this.str2, this.str3, this.str4, this.str5);
    }
}
let p0 = new Print( '喜洋洋', '懒洋洋', '沸羊羊', '美洋洋');
p0.say();
​

5、 getter与setter

官方的另外一个名字:存取器 通过getters/setters来截取对对象成员的访问

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

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

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

代码演示:

export default {}
​
class MyName {
    private _fullname: string = "熊大";
​
    //读取字段的值
    get fullname() {
        console.log("get被调用了");
        return this._fullname;
    }
    // 设置读取字段的值
    set fullname(newName: string) {
        console.log("set被调用了");
       this._fullname = newName;
    }
}
​
let p0 = new MyName();
p0.fullname="熊二";
console.log(p0);
console.log(p0.fullname);

6、抽象类

定义:

抽象类做为其它派生类的基类使用。它们一般不会直接被实例化

抽象类是专门用于定义哪些不希望被外界直接创建的类的

抽象类和接口—样用于约束子类

抽象类和接口区别

抽象方法必须包含abstract关键字并且可以包含访问修饰符

接口中只能定义约束,不能定义具体实现。而抽象类中既可以定义约束,又可以定义具体实现

代码演示:

export default {}
​
abstract class Person {
    abstract name: string;
    abstract age: number;
    abstract show(): string;
​
    showName(): void {
        console.log("你好");
​
    }
}
​
class Student extends Person {
    name: string = "光头强"
    age: number = 30
    show() {
        return '熊出没'
    }
}
​
let p0 = new Student();
console.log(p0);//Student { name: '光头强', age: 30 }
let res =p0.show();
console.log(res);//熊出没

7、implements子句

类可以实现接口,使用关键字implements

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

注意点:

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

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

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

代码演示:

export default {}
​
interface IPersonInfo {
    name: string;
    age: number;
    sex?: string;
    show(): void;
}
​
interface IMusic {
    music: string;
}
​
class Person implements IPersonInfo, IMusic {
    name: string = "熊大";
    age: number = 18;
    sex: string = "公";
    music: string = "会唱歌"
    show(): void {
        console.log(`我叫${this.name},今年${this.age},我是${this.sex}的`)
    }
}
let p0 = new Person();
p0.sex = ""
p0.show();
​
​
// 注意点:只要一个接口继承了某个类,那么就会继承这个类中所有的属性和方法
//但是只会继承属性和方法的声明,不会继承属性和方法实现
​
interface ITest extends Person {
    salary: number;
}
​
class Star extends Person implements ITest {
    name: string = "熊二";
    age: number = 20;
    salary: number = 30000;
}
let p1 = new Star();
console.log(p1.name);
console.log(p1.salary);

8、类的初始化顺序

基类的字段被初始化

基类构造函数运行

子类的字段被初始化

了类构造函数运行工

代码演示

export default {}
​
class Old {
    name: string = "熊大";
    constructor() {
        console.log(`我是${this.name},我主演了《熊出没》`);
    }
}
​
class Young extends Old{
    name: string = "喜洋洋";
    constructor() {
        super();
        console.log(`我是${this.name},我主演了《喜羊羊与灰太狼》`);
    }
}
let p0 = new Young();

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TypeScript使用场景包括但不限于以下几种情况: 1. 封装和组织代码:可以帮助开发者将相关的属性和方法组织在一起,实现代码的模块化和封装。通过定义,可以更好地管理和维护代码。 2. 创建对象:通过,可以创建多个对象,并且每个对象都具有相同的属性和方法。这样可以节省代码量,并且方便对对象进行统一的操作和管理。 3. 继承和多态:通过继承,可以创建一个基,并从基派生出子。子可以继承基的属性和方法,并且可以进行修改和扩展。这样可以实现代码的复用和扩展性。 4. 型的定义和校验:TypeScript是静态型语言,通过定义,可以明确指定属性和方法型,并且在编译时进行型校验,防止潜在的型错误。 5. 的实例化和初始化:通过的构造函数,可以在创建对象时对对象进行初始化操作,为对象的属性赋初值,确保对象的初始状态符合预期。 总结来说,TypeScript使用场景主要包括封装和组织代码、创建对象、继承和多态、型的定义和校验以及的实例化和初始化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [TypeScript深度剖析:TypeScript的理解?应用场景?](https://blog.csdn.net/weixin_40808668/article/details/129420594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [【typescriptTypescript联合型断言 、Typescript 泛型函数以及使用场景](https://blog.csdn.net/m0_64494670/article/details/129271005)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值