TS中的类(class)

ts中的类和js中类基本相同,但还是有所差别,所以还是需要单独去写一下
ts类的一个简单例子

class Person {
    name: string
    age: number
    constructor(name: string, age: number) {
        this.name = name;
        this.age = age;
    }
    say() {
        console.log(`年龄为${this.age}的${this.name}say`)
    }
}
let person: Person = new Person('张三', 18);
person.say()

可以看到用法基本相同,除了ts类型检查外,在ts的class中,变量需要提前在constructor前声明

extends继承 set get关键字 static静态属性 和es6类基本相同,

ts中class特有的属性

 名词解释
派生类:子类
基类:父类

修饰符

  1. 默认公共 public 自由访问程序里定义的变量和方法
  2. 私有的 private 当成员被标记为私有属性,只能在类进行使用,不能外部使用,子类也不可访问
  3. 受保护的 protected 和private相似,唯一不同的是,被protected修饰的属性可以在子类中访问
//私有 private
class PrivateClass {
    private name: string
    constructor(name: string) {
        this.name = name;
    }
}

let privateState: PrivateClass = new PrivateClass('私有变量')
//privateState.name = '111' //error 属性“name”为私有属性,只能在类“PrivateClass”中访问
//受保护的 protected  
class ParentClass {
    protected name: string
    private age: number
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }
}
class ChildClass extends ParentClass {
    constructor(name: string, age: number) {
        super(name, age)
        console.log(this.name);
        // console.log(this.age);//error 因为是私有属性,子类不能访问 属性“age”为私有属性,只能在类“ParentClass”中访问

    }
}
let childClass: ChildClass = new ChildClass('张三', 18)
//childClass.name='asas' //error 属性“name”受保护,只能在类“ParentClass”及其子类中访问

readOnly 只读

只读属性必须在声明或构造函数时被初始化

class ReadOnlyPerson {
    readonly name: string
    readonly age: number = 18 //将声明和赋值放在一起
    constructor(name: string) {
        this.name = name;
    }
}
let readOnlyState: ReadOnlyPerson = new ReadOnlyPerson('readOnly');
console.log(readOnlyState.name); //可以对只读属性进行访问
//ReadOnlyPerson.name = '我要修改readOnly的名称'//error 无法分配到 "name" ,因为它是只读属性

抽象类

抽象类作为其他派生类的基类使用,一般不会被实例化。与接口不同的是抽象类中可以包括具体实现细节;
abstract关键字用于定义抽象类以及在抽象类内部定义抽象方法

//普通抽象类
abstract class AbstractClass {
    name: string
    constructor(name: string) {
        this.name = name
    }
    say(name: string): string {
        return `${name}say:hello,world`
    }
}
//抽象类中的抽象属性
abstract class AbstractStateClass {
    abstract name: string;
    // constructor(name:string) {
    //     this.name = name //error 不能在构造函数中访问类“AbstractClass”中的抽象属性“name”
    // }
    say(): string {
        return this.name + 'say:Hello,world'
    }
}
//抽象类中的抽象方法
//抽象类中的抽象方法在派生类中必须实现
abstract class AbstractFunClass {
    name: string
    constructor(name: string) {
        this.name = name
    }
    abstract say(name: string): string
}
class AbstractPerson extends AbstractFunClass {
    constructor(name: string) {
        super(name)
    }
    say(name: string): string {
        return name + 'say:hello,world'
    }
}

接口继承类

可以把类当成接口使用,因为类可以创建出类型

class InterfaceClass {
    name: string;
    age: number
}
interface ExtendsClassInterface extends InterfaceClass { //接口继承类
    sex: boolean
}
let specialPerson: ExtendsClassInterface = {
    name: '张三',
    age: 18,
    sex: false
}

### TypeScript (TS) 的 `class` 概念 TypeScript 是 JavaScript 的超集,它扩展了 JavaScript 来提供更好的型安全性和结构化支持。在 TypeScript 和 ES6 引入的 `class` 关键字用于创建(即面向对象程序设计的基础),这允许更清晰地组织代码并提供更强大的特性。 #### **什么是 (`class`)** 定义了一种型的实例(对象)的行为和属性。通过使用 `class` 关键字,您可以声明一个新的,该可以包含构造函数、静态方法、成员变量和方法。 #### **构造函数** 构造函数是的特殊方法,当创建的新实例时自动调用。它们通常用于初始化实例的状态: ```typescript class MyClass { constructor(private myAttribute: any) { // 初始化操作 } } ``` 在这个例子,`MyClass` 有一个私有属性 `myAttribute`,其在构造函数设置。 #### **继承** 也可以从其他派生(继承),这使得子可以重用父的功能,并且能够定义自己的行为: ```typescript class ParentClass { public method() { // 方法实现 } } class ChildClass extends ParentClass { override method() { // 覆盖父的方法实现 } } ``` 这里,`ChildClass` 继承自 `ParentClass` 并重写了其方法。 #### **接口和型约束** 在 TypeScript ,还可以使用接口来描述对象的形状(包括属性和方法)。结合 `extends` 关键字,可以通过实现接口来明确指定它的行为和结构: ```typescript interface MyInterface { name: string; greet(): void; } class MyClass implements MyInterface { constructor(public name: string) {} greet() { console.log(`Hello, ${this.name}!`); } } ``` 在这个例子,`MyClass` 实现了一个名为 `MyInterface` 的接口。 ### **使用 `type` 进行约束** 在您的引用示例展示了如何使用 `type` 进行泛型型约束。这允许创建更具灵活性的函数,可以根据传递给它们的具体型执行不同的逻辑: ```typescript type Class = string; function result<T extends Class>(val: T): T { console.log(val.length); return val; } result<string>("zhangsan"); ``` 这个 `result` 函数接受一个参数,假设它是某种型(这里通过 `T extends Class` 进行约束),并返回相同的值。型断言 (`<string>`) 表明调用者知道传递的是字符串型。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值