前端 TS 语法继承 多态 修饰符 readonly 抽象类 ts 基本写法 可选 剩余参数 函数重载 接口 类(3)

继承

继承之间的叫法
A类继承了B类,那么A类叫做子类,B类叫成基类
子类 ---》派生类
 基类 ---》超类(父类)

// 继承之间的叫法
// A类继承了B类,那么A类叫做子类,B类叫成基类
// 子类 ---》派生类
// 基类 ---》超类(父类)

(() => {
    // 定义属性
    class Person {
        name: string
        age: number
        gender: string
        constructor(name: string,age:number,gender:string){
            this.name = name
            this.age = age
            this.gender = gender
        }

        // 定义实例方法
        sayHi(str:string){
            // ${str} 代表你是谁
            console.log(`我是:${this.name},${str}`)
        }
    }
    // 定义类 继承person
    class Student extends Person{
        constructor(name: string,age:number,gender:string){
            super(name , age, gender)
        }
        sayHi() {
            console.log('wos')
            super.sayHi('jjjj')
        }
    }
    const person = new Person('da',89,'a')
    person.sayHi('kkk')
    const stu = new Student('sss',98,'jjj')
    stu.sayHi()
})()

多态

多态  : 父类型的引用指向子类型的对象,不同类型的对象针对相同的方法,产生不同的行为

// 多态  : 父类型的引用指向子类型的对象,不同类型的对象针对相同的方法,产生不同的行为
(() => {
    // 定义一个父类
    class Animak {
        // 定义属性
        name: string
        // 定义一个构造函数
        constructor(name: string) {
            // 进行赋值
            this.name = name
        }
        // 实例方法
        run(distance: number = 0) {
            // this.name  是每个类的名字
            console.log(`跑了${distance} 米`, this.name)
        }
    }

    // 定义一个子类
    class Dog extends Animak {
        // 定义构造函数
        constructor(name: string) {
            // 调用父类的构造函数,实现子类种属性的初始化操作,
            // 换句话说 继承了父类的属性  但是把原有的name换成自己的name
            super(name)
        }
        // 实例方法
        run(distance: number = 7) {
            console.log(`跑了${distance} 米`, this.name)
        }
    }

    // 定义一个子类
    class Pig extends Animak {
        constructor(name: string) {
            super(name)
        }
        run(distance: number = 40) {
            console.log(`跑了${distance} 米`, this.name)
        }
    }

    // 实例化父类对象
    const ani: Animak = new Animak('动物')
    // 实现run方法
    ani.run()

    // 实例化子类对象
    const dog: Dog = new Dog('大黄')
    // 实现run方法
    dog.run()

    // 实例化子类对象
    const pig: Pig = new Pig('八戒')
    // 实现run方法
    pig.run()

    console.log('====================================')

    // 实例化子类对象  他是通过继承父类的 进行实例化
    const dog1: Animak = new Dog('小黄')
    // 实现run方法
    dog1.run()

    // 实例化子类对象  他是通过继承父类的 进行实例化
    const pig1: Animak = new Pig('小猪')
    // 实现run方法
    pig1.run()

    console.log('====================================')
    // 该函数需要的参数Animak类型的
    function showRun(ani: Animak) {
        // 实现run方法
        ani.run()
    }
    // 实例化
    const dog2: Animak = new Dog('oo黄')
    // 实现run方法
    showRun(dog2)
    showRun(pig1)
    //都是继承父类的属性,在子类进行运行的,然后分别实现了子类的run方法
})()

 

修饰符

修饰符 主要描述类中的成员(属性,构造函数,方法)可访问性

 类中的成员都有自己的默认的访问修饰符

 public  默认修饰符  代表公共任何位置都可以访问

private 私有的修饰符号  类成员如果使用private来修饰,那么外部将无法访问内部数据,子类也无法访问数据

 protected 受保护修饰符 那么外部无法访问这个成员数据的,当然子类也可以访问


// // 修饰符 主要描述类中的成员(属性,构造函数,方法)可访问性
// // 类中的成员都有自己的默认的访问修饰符
// //  public  默认修饰符  代表公共任何位置都可以访问
// // private 私有的修饰符号  类成员如果使用private来修饰,那么外部将无法访问内部数据,子类也无法访问数据
// // protected 受保护修饰符 那么外部无法访问这个成员数据的,当然子类也可以访问
(()=>{
    // // 定义类
    // class Person{
    //     // 定义属性
    //    public name : string
    //     // 、定义构造函数 
    //    public constructor(name:string){
    //         // 更新属性
    //         this.name = name
    //     }
    //     // 定义方法
    //    public eat(){
    //         // 输出  this.name  当前名字
    //         console.log('输出',this.name)
    //     }
    // }
    // // 实例化
    // const per = new Person('大蛇丸')
    // // 输出per。name
    // console.log(per.name)
    // // 输出 per.eat
    // per.eat()
    // ------------------------------------------
        // 定义类
        class Person{

            // 定义属性
           protected name : string
            // 、定义构造函数 
           public constructor(name:string){
                // 更新属性
                this.name = name
            }
            // 定义方法
           public eat(){
                // 输出  this.name  当前名字
                console.log('输出',this.name)
            }
        }

        // 定义子类
        class Student extends Person{
            constructor(name:string){
                super(name)
            }
            play(){
                console.log('woxh',this.name)
            }
        }



        // 实例化
        const per = new Person('大蛇丸')
        // 输出per。name
        // console.log(per.name)
        // 输出 per.eat
        per.eat()
        const stu = new Student('hod')
        stu.play()
})()

 

readonly 

 readonly修饰符 修饰后 该成员的值 就不可以被外部随意修改 


// readonly修饰符 修饰后 该成员的值 就不可以被外部随意修改
(()=>{
    // // 定义类
    // class Person{
    //    readonly  name:string
    //     // 定义构造函数
    //     constructor(name:string){
    //         // 更新变量
    //         this.name = name
    //     }
    //     // 方法
    //     sayHi(){
    //         // 输出
    //         console.log("你好",this.name)
    //     }
    // }
    // // 实例化
    // const person:Person = new Person('小甜甜')
    // // 修改内容
    // // person.name = '大甜甜'  //readonly  不可以外部修改
    // // 打印person
    // console.log(person)
    // // 打印name
    // console.log(person.name)
    // --------------------------------------------------------
    class Person{
        // 构造函数中的name,一旦使用readonly进行修饰,
        // 那么person中就有name的属性成员,外部也是无法修改的name属性成员值

        // constructor(private name:string ='大甜甜'){
        //     this.name = name
        // }

        constructor(readonly name:string ='大甜甜'){
            this.name = name
        }

        // constructor(protected name:string ='大甜甜'){
        //     this.name = name
        // }

    }
    const person :Person = new Person('小甜甜')
    console.log(person)
    // person.name = '佐助'  readonly  不可以外部修改
    console.log(person.name)

})()

抽象类 

抽象类 :包含抽象方法(抽象方法一般没有任何的具体内容的实现),
也可以包含实例方法,抽象类是不能实例化,为了让子类实例化,实现内部抽象的方法

 abstract  抽象类  定义之后,没有具体的方法  所以没有办法打印
 但是可以通过派生类(子类)进行继承来达到效果 在进行打印
也可以在定义属性的时候定义默认值  例子:  name: string= 'xiaohuang'

// // 抽象类 :包含抽象方法(抽象方法一般没有任何的具体内容的实现),
// // 也可以包含实例方法,抽象类是不能实例化,为了让子类实例化,实现内部抽象的方法

// // abstract  抽象类  定义之后,没有具体的方法  所以没有办法打印
// // 但是可以通过派生类(子类)进行继承来达到效果 在进行打印
// // 也可以在定义属性的时候定义默认值  例子:  name: string= 'xiaohuang'
(()=>{
    // 定义抽象类
    abstract class Animak{
        // 定义抽象类 的属性
        abstract name :string
        // 定义抽象类的方法
        abstract eat()
        // 定义普通方法
        sayHi(){
            console.log('ninhao')
        }
    }
    // 定义派生类 (子类)
    class Dog extends Animak{
        // 继承父类的属性  并添加了默认值( name: string= 'xiaohuang')
        name: string= 'xiaohuang'
        // 继承父类的eat()方法 输出
        eat() {
            console.log('chi')
        }
    }
    // 实例化
    const dog :Dog = new Dog()
    // 派生类输出eat()方法
    dog.eat()

    // 调用的是抽象类中的实例化方法
    // 派生类输出父类的sayhi方法
    dog.sayHi()
    // 输出dog,name
    console.log(dog.name)

})()

ts 基本写法

// 可以把function 放在前边  也可以放在后边,的书写方式

// function 放前边 需要实例化  才行

// function 放后边 直接输出附带值 就可以

// :string  代表的是返回值  是什么类型的

(() => {

    // ts书写方法  字符串
    function add(x:string,y:string):string{
        return x+y
    }
    const res :string = add('11','22')
    console.log(res,' ts书写方法  字符串')
// ==========================================================
    // // ts书写方法  数字方法一
     function add1(x:number,y:number):number{
        return x+y
    }
    const res1 :number = add1(8,77)
    console.log(res1,'ts书写方法  数字方法一')
// ==========================================================

    //  // ts书写方法  数字方法二
    const add2=function(x:number,y:number):number{
        return x+y
    }
    console.log(add2(99,8),' ts书写方法  数字方法二')
})()

 

可选

// 可选参数 和默认参数

// ?表示可选参数  可以写  也可以不写 默认值

// firstName :string='东方' 默认参数

(()=>{
   //定义属性
    const getFullName = function (firstName :string='东方',lastName?:string):string{
        // 判断
        if(lastName){
            return firstName+ lastName
        }else{
            return firstName
        }
    }

    console.log(getFullName)
    console.log(getFullName('hzhsha'))
    console.log(getFullName('hzhsha','hdh'))
})()

 

剩余参数

 剩余的参数

 ...args: string[] 代表剩下的所有参数的属性都是str的类型

如果有两个或者属性,从第0开始计算,抛去已有的属性,剩下的才是  。。。args

(() => {
    function showRun(str: string,...args: string[]) {
        // 有多余的属性
    // function showRun(str: string, str2: string,...args: string[]) {
        console.log(str)  // a 
        // console.log(str2)  // e
        console.log(args) // ['e', 'eee', 'e', 'eee']
    }
    showRun('a', 'e', 'eee', 'e', 'eee')

})()

 

函数重载

定义一个函数的时候,可能会遇见定义同名字的函数 写这个时候就是函数重载 了

(() => {
    // 函数重载   (名称相同了)
    function add (x:string,y:string):string
    function add (x:number,y:number):number

    function add(x:string|number,y:string|number):string|number {
        if(typeof x==='string'&& typeof y==='string'){
            return x+y
        }else if (typeof x==='number'&& typeof y==='number'){
            return x+y
        }
        return 'll' //因为报错缺少return  
    }

        console.log(add('主管', '不知道'))
        console.log(add(1022, 44))
        // console.log(add("1022", 44))

})()

接口

 interface 定义接口

(()=>{
    // 定义一个默认接口
    interface IPerson{
        firstName :string //姓氏
        lastName : string //名字
    }
    // 输出姓名  (引用默认接口添加新的名称)
    function showFullName (person:IPerson){
        return person.firstName + "_"+ person.lastName
    }

    const person ={
        firstName :'懂法',
        lastName:'不到'
    }

    console.log(showFullName(person))

})()

类的样式

(() => {
    // 定义接口
    interface IPerson {
        firstName: string
        lastName: string
    }
    // 定义类型  这些就相当于默认值 谁都可以用
    class Person {
        // 、定义公共字段
        firstName: string
        lastName: string
        fullName: string
        // 定义构造器函数
        constructor(firstName: string, lastName: string) {
            // 更新数据值
            this.firstName = firstName
            this.lastName = lastName
            this.fullName = this.firstName+'-'+this.lastName
        }
    }
    // 从新定义函数 然后返回自己想要的类型 
    //可以从新定义一个函数  然后继承上边的接口类型
    function showFullName (person:IPerson){
        return person.firstName + '-' +person.lastName
    }
    // 实例化对象
    const person = new Person('诸葛','大壮')
    console.log(showFullName(person))

})()

 

元组

一旦定义了数组类型 就必须用指定的类型 用其他类型 报错

let arr1 :number[] = [10,29,394,45]
console.log(arr1)  //[10, 29, 394, 45]

// 数组定义方式2
let arr2 :Array<number> = [10,29,394,45]
console.log(arr2)   //[10, 29, 394, 45]

// 元组
// 就是按照属性的数据 进行后边数据的类型进行对应  
let arr3 :[string,number,boolean] = ['天',2,true]
console.log(arr3)  //['天', 2, true]

 枚举

// // // enum 枚举的意思 枚举就是按照顺序输出 也可以获取索引值
enum Color {
    red = 5,
    green,
    blue
}
console.log(Color[1])  //red
console.log(Color.red)  //5

any 

 any类型  如果不确定当前类型的时候我们可以使用any类型

// // any类型  如果不确定当前类型的时候我们可以使用any类型
let str :any = 111114
console.log(str)  //111114

let str1 :any = "111114"
console.log(str1)  //"111114"

 void类型

// // 表示没有返回值  没有return
function showRun():void{
    console.log('简单是') //"简单是"
}
console.log(showRun())   //undefined

 

联合数据

function getObj(str:number|string):number{
    // 获取数字长度
    return str.toString().length
}
    console.log(getObj("22211111111111111")) //17

// // 就是可以在里边定义多个属性   返回字符串 
function getObja(str: number | string): string {
    //转换成字符串 
    return str.toString()
}
console.log(getObja("22211111111111111")) //22211111111111111

 

断言

 类型断言  也可以获取数字的长度   
(就是告诉编辑器我知道自己在干啥)
 断言方式1 (<string>str)

// // 类型断言  也可以获取数字的长度   
// // (就是告诉编辑器我知道自己在干啥)
// // 断言方式1 (<string>str)
function getStra(str:number|string):number{
    if((<string>str).length){
        return (<string>str).length
    }else{
        return str.toString().length
    }
}
console.log(getStra('22222')) //5
console.log('----------------------------')


// 断言方式2  (str as string)
function getStr(str:number|string):number{
    if((<string>str).length){
        return (str as string).length
    }else{
        return str.toString().length
    }
}
console.log(getStr('2222222')) //7

 

set get   去值器

(()=>{
// 有报错  但是不影响输出
    class Person{
        firstName :string
        lastName : string
        constructor(firstName:string,lastName:string){
            this.firstName = firstName
            this.lastName = lastName
        }
        get fullName(){
            return this.firstName + '-' + this.lastName
        }
        set fullName(val){
            let name = val.split('_')
            this.firstName = name[0]
            this.lastName = name[1]

        }
    }

    const person : Person = new Person('东方' , '大壮')
    console.log(person)  //Person {firstName: '东方', lastName: '大壮'}
    console.log(person.fullName)  //东方-大壮
    person.fullName = "诸葛_大壮"  //firstName: "诸葛"  lastName: "大壮"

})()

 静态资源

静态资源无法正常通过方法进行访问


(()=>{

    // class Person {
    //     name : string
    //     age : string
    //     constructor(name:string ,age :string){
    //         this.name = name
    //         this.age = age 
    //     }
    //     sayHi(){
    //         console.log('萨瓦迪卡')
    //     }
    // }
    // const person : Person = new Person('xiao','jjdl')
    // console.log(person.name)  //xiao
    // console.log(person.age)   //jjdl
    // person.sayHi() //萨瓦迪卡


//     // --------------------------------
// // 静态资源无法正常通过方法进行访问
// // static  静态资源
    class Person{
        static name1:string = '天'
        constructor(){

        }
        static sayHi(){
            console.log('萨瓦迪卡')
        }
    }
    console.log(Person.name1) //天
    Person.name1 = '做主'
    console.log(Person.name1) //做主
})()

 

 函数类型  

通过接口的方式作为函数的类型使用 、

(()=>{
    // 定义接口
    interface ISearchFunc {
        // 定义接口值类型
        (source : string , subString : string) : boolean
    }

    // 创建函数  类型是上边的接口
    const searchString : ISearchFunc = function (source : string , subString : string) : boolean{
        // 返回的source字符串中查找subString 这个字符串有没有字  
            //  有就是true  没有就是false
        return source.search(subString) > -1
    }
    // 有就是true  没有就是false
    console.log(searchString('哈哈,年度十大' , '你')) //false
    console.log(searchString('哈哈,年度十大' , '大')) //true
})()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/318057.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++ 程序设计入门基础】- 第4节-函数

1、函数 函数是对实现某一功能的代码的模块化封装。 函数的定义&#xff1a; 标准函数&#xff1a; 输入 n 对整数的 a、b &#xff0c;输出它们的和。 #include <iostream> #include <windows.h> using namespace std;int add(int a,int b);//函数原型声明int…

ppt怎么录屏录音并且导出?好用录屏软件推荐

ppt已经成为了日常工作与学习中必不可少的工具&#xff0c;而ppt屏幕录制功能&#xff0c;可以方便用户将他人的演讲或视频中的内容记录下来&#xff0c;以便进一步学习与研究。录制ppt演示并将其导出为视频文件&#xff0c;可以帮助我们进行分享&#xff0c;但是很多人不知道p…

uniapp 制作 wgt 包(用于 app 的热更新)

升级版本号 修改 manifest.json 的配置&#xff0c;应用版本名称和应用版本号 必须高于上一版的值。 制作 wgt 包 发布 wgt 包 打开 uni-admin 项目的升级中心 上传后会自动生成下载链接 app 的静默热更新 发布新版后&#xff0c;用户打开app&#xff0c;后台会自动下载 wgt…

【NR技术】RRC状态转移以及RRC重建立过程

1 概述 本文介绍NR RRC状态转移的过程以及RRC重建立相关的过程。 2 RRC状态转移 2.1 RRC connected 态到 RRC inactive转移 RRC connected到RRC inactive state状态转换&#xff0c;gNB由gNB- cu和gNB- du (s)组成的场景下&#xff0c;如图1所示 图1 RRC connected to RRC …

odoo17基础培训1-odoo开发基础知识准备以及odoo17开发环境安装

odoo17基础培训 一、odoo开发基础知识准备以及odoo17开发环境安装 1、odoo是什么&#xff1f; 当我介绍客户使用odoo系统作为业务管理平台时&#xff0c;有时会被问到Odoo是什么&#xff1f; 简单点&#xff0c;可以这么说&#xff1a; Odoo是一套完整的系统&#xff0c;是…

强化学习(一)简介

强化学习这一概念在历史上来源于行为心理学&#xff0c;来描述生物为了趋利避害而改变自己行为的学习过程。人类学习的过程其实就是为达到某种目的不断地与环境进行互动试错&#xff0c;比如婴儿学习走路。强化学习算法探索了一种从交互中学习的计算方法。 1、强化学习 强化学…

ftp安装与配置 云服务器 CentOS7

1、FTP的安装 #安装 yum install -y vsftpd#设置开机启动 systemctl enable vsftpd.service#启动 systemctl start vsftpd.service#停止 systemctl stop vsftpd.service#查看状态 systemctl status vsftpd.service 2、配置FTP #修改前先进行备份文件 cp /etc/vsftpd/vsftpd…

SAP PI之MessageMapping

下图是ESR配置中各种对象的关联关系&#xff0c;注意OperationMapping和MessageMapping的方向性 MsgMapping是两个MassageType之间的关系&#xff0c;用于ServiceInterface的OperationMapping中发送和接收方在Request和Response结构之间的映射&#xff0c;如果ServiceInterface…

《SRE Google 运维解密》笔记

指导思想 介绍 Google 生产环境介绍 borg 是 k8s 的前身。 拥抱风险 服务质量 现在的 SLO 没有更细粒度的划分到季度 如果划分到季度&#xff0c;需要用这个数据来限制什么或者进行什么活动&#xff1f; L1S 链路的 SLA 的签署工作已经做了很多 对于 SLA 的达成情况数据没有…

代码随想录算法训练营第七天|哈希表理论基础,454.四数相加II ,383. 赎金信 ,15. 三数之和 ,18. 四数之和

刷题建议 刷题建议与debug 代码随想录目前基本都有了视频讲解&#xff0c;一定要先看视频&#xff0c;事半功倍。写博客&#xff0c;将自己的感悟沉淀下来&#xff0c;不然会忘大家提问的时候&#xff0c;记得要把问题描述清楚&#xff0c;自己在哪一步遇到了问题&#xff0c…

AWS EC2的SSM配置(AWS云中的跳板机)

问题 开发人员需要访问AWS云中私有子网的数据库服务等&#xff0c;都需要通过EC2进行SSH隧道代理。这里假设本地已经有一款稳定优秀的SSH客户端工具&#xff0c;并且假设已经会熟练使用SSH的隧道代理。 1.创建EC2 搜索找到EC2服务&#xff0c;如下图&#xff1a; 点击“启动…

Docker 配置国内镜像源加速

1. 国内镜像源总览 名称路径中国官方镜像https://registry.docker-cn.com网易163镜像http://hub-mirror.c.163.com中科大镜像https://docker.mirrors.ustc.edu.cn阿里云镜像https://[xxx].mirror.aliyuncs.com 2. 阿里云镜像源 地址&#xff1a;https://cr.console.aliyun.c…

【开源】基于JAVA+Vue+SpringBoot的校园电商物流云平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 商品数据模块2.3 快递公司模块2.4 物流订单模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 商品表3.2.2 快递公司表3.2.3 物流订单表 四、系统展示五、核心代码5.1 查询商品5.2 查询快递公司5.3 查…

PLSQL启动报错:Initialization error,不能初始化

出现场景&#xff1a;我这里原来有个旧版的PLSQL&#xff0c;想用新版的又装了个新版&#xff0c;启动的时候报错 解决办法 1.核对程序位数 第一个提示明显看到是和程序位数相关的&#xff0c;不管是32位还是64位要做到向匹配 2.设置oci.dll 第二个提示可以看到是和oci.dll…

jenkins环境搭建

jenkins环境搭建 1.环境说明2.环境准备1.jdk安装2.安装Git3.安装sshpass4.安装Maven 3.安装Jenkins(war包方式安装)1.安装2.镜像加速 4.官网提供的yum方式安装5.访问 1.环境说明 keyvalue环境centos7jdk版本11git2.43.0maven3.9.6jenkins最新版本http://mirrors.jenkins-ci.or…

(收藏)数据治理:一文讲透数据安全

数据治理&#xff1a;一文讲透数据安全 数据安全是数据治理的核心内容之一&#xff0c;随着数据治理的深入&#xff0c;我不断的碰到数据安全中的金发姑娘问题&#xff08;指安全和效率的平衡&#xff09;。 DAMA说&#xff0c;降低风险和促进业务增长是数据安全活动的主要…

【从零开始学习Java重要集合】深入解读ThreadLocal类

目录 前言&#xff1a; ThreadLocal&#xff1a; ThreadLocal的内部结构&#xff1a; ThreadLocal的常用方法&#xff1a; 1.set方法&#xff1a; 2.get方法&#xff1a; 3.setInitialValue方法 remove方法&#xff08;&#xff09;&#xff1a; ThreadLocalMap&…

第十二章 Java内存模型与线程(一)

文章目录 12.3 Java内存模型12.3.1 主内存与工作内存12.3.2 内存间交互操作小结12.3.3 对于volatile型变量的特殊规则12.3.5 原子性、可见性与有序性12.3.6 先行发生原则 12.3 Java内存模型 12.3.1 主内存与工作内存 1.Java 内存模型规定了所有的变量都存储在主内存&#xff…

Java反转单链表

/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ //核心思想&#xff0c;利用cur和Curnex…

驱动树莓派直流电机(二)——python

一、安装spyder 我喜欢用spyder编写python 有两种方法安装spyder&#xff0c;第一种&#xff08;版本更新&#xff09;&#xff0c;但是我更细化第二种&#xff0c;简单 方法一&#xff1a;在ubuntu PC端输入如下代码 wait~~~~~~~~~~~ 安装的慢就用下面这个代码 或者设置切…