学习Typescript(第二弹)

news2024/10/6 4:09:19

接口

对象类型接口

  • 先用interface定义一个List接口,成员有id时number类型,name是string类型
  • 再定义一个Result,成员是List数组
  • 定义一个render函数,接收参数是result

// 先用interface定义一个List接口
interface List {
    id:number,
    name:string,
}

// 再定义一个Result,成员是List数组
interface Result {
    data: List[]
}
// 定义一个render函数
function render(result:Result) {
    result.data.forEach((value) => {
        console.log(value.id, value.name)
    })
}
// 假设从后端拿到的result数据,符合我们的定义,打印出来的结果符合我们的预期
let result = {
    data:[
        {id:1,name:'a'},
        {id:2,name:'b'},
    ]
}
render(result)

  • 打印出来的结果符合我们的预期

  • 但是实际开发过程中,后端给的数据往往传过来预定之外的字段

检查原则

  • 这样ts并不会报错,因为这是鸭式辨型法:如果一只鸟看起来像鸭子,游起来像鸭子,叫起来像鸭子,那么这只鸟就可以被认为是鸭子
  • 所以只要传入的对象满足接口的必要条件,那就是允许的,也就不会报错,即使传入多余的类型字段,也可以通过类型检查。
  • 但是如果你是直接传入类型字面量的话,ts就会对额外的字段进行类型检查

如何绕过这种类型检查

  • 将对象字面量赋值给变量

  • 使用类型断言
    明确告诉编译器,这个对象的类型就是Result,这样编译器就会绕过类型检查,有两种类型断言方法,第二种在react中会产生歧义

  • 使用字符串索引签名
    用任意的字符串去索引List,可以得到任意的结果,这样List就可以支持多个属性了

对象属性

  • 可选属性,加?

如果要直接判断有没有gender属性,那ts就会报错

所以就有可选属性

  • 只读属性,加readonly,是不允许修改的

可索引类型接口

数字索引(相当于数组)[index:number]

interface StringArray {
    [index:number]: string
}

用任意的数字去索引StringArray,相当于声明了一个字符串数组

字符串索引[x:string]

如果声明了字符串索引是不可以再声明其他类型的

两种类型可以混用

这样是既可以用字符串索引Strings,也可以用数字去索引Strings

混用时数字索引的返回值类型必须是字符串索引返回值的子类型!!!这是因为JavaScript会进行类型转换,将number转换成string,这样就能保持类型的兼容性

let ss:Strings = {
    1:1,
    'aa':2,
    'bb':'cc',
}
ss[1]里面的数字number会被转换成字符串string

比如

但是你可以把上面的string类型改成any就可以兼容number了

函数类型接口

三种方式定义函数接口

混合类型接口

既可以定义一个函数,也可以像对象一样定义属性和方法

实现这个混合类型,发现会报错

给它加上属性和方法后发现还是报错

那就给它加上断言就不会有报错了

但是这样会有一个问题,给全局暴露了一个变量类,它是一个单例,如果想创建多个lib,那就要用一个函数封装一下,这样可以创建多个实例

函数

函数定义

  • 定义方式:变量定义、function、类型别名、接口定义;这些都是定义函数类型,无函数体
  • 类型要求:参数类型必须声明;返回值类型一般无需声明。

函数参数

  • 参数个数:实参和形参必须一一对应

  • 可选参数:必选参数不能放在可选参数后

  • 默认参数:在必选参数前,默认参数不可省略;在必选参数后,默认参数可以省略

  • 剩余参数

函数重载

  • 静态类型语言:函数的名称相同,参数的个数或类型不同
  • Typescript:预先定义一组名称相同,类型不同的函数声明,并在一个类型最宽松的版本中实现;使用相同名称和不同参数数量或类型创建多个方法的一种能力
  • 函数重载真正执行的是同名函数最后定义的函数体 在最后一个函数体定义之前全都属于函数类型定义 不能写具体的函数实现方法 只能定义类型

基本实现

  • 类中定义的属性都是实例属性,类中定义的方法都是原型方法
class Car {
    constructor(name:string) {
        this.name = name;
    }
    name:string
    getColor() {}
}

console.log(Car.prototype); // 打印出来是不包含内部属性name的

打印出来是不包含内部属性name的


属性在实例上

let car = new Car('BMW');
console.log(car);

  • 实例属性必须有初始值, 或在构造函数中被赋值,或为可选成员
class Car {
    constructor(name:string) {
        // this.name = name; // 在构造函数中被赋值
    }
    name:string = 'BMW' // 要给一个初始值
    getColor() {}
}

继承

  • 子类的构造函数中必须包含super调用
class BMW extends Car {
    constructor(name:string, color:string){
        super(name); // 子类的构造函数中必须包含super调用
        this.color = color // 子类自己声明的变量要在super之后
    }
    color:string
}

成员修饰符

  • public: 对所有人可见,所有成员默认为 public

  • private:

    • 只能在被定义的类中访问,不能通过实例或子类访问;

  • private constructor:不能被实例化,不能被继承;

  • protected:

    • 只能在被定义的类和子类中访问,不能通过实例访问;

    • protected constructor:只能被实例化,不能被继承;

  • readonly: 必须有初始值,或在构造函数中被赋值

  • static: 只能由类名调用,不能通过实例访问,可继承

构造函数参数中的修饰符

  • 将参数变为实例属性

抽象类

  • 不能被实例化,只能被继承

    • 抽象方法包含具体实现 子类直接复用

    • 抽象方法不包含具体实现 子类必须实现

  • 多态

    • 多个子类对父抽象类的方法有不同实现,实现运行时绑定

abstract class Robot {
    move(){
        console.log('move');
    }
    abstract speed():void
}
class Car extends Robot {
    constructor(name:string) {
        super()
        this.name = name;
    }
    name:string
    getColor(){}
    speed(){
        console.log('car speed');
    }
}
let car = new Car('BMW');
car.move()
class Electrical extends Robot {
    speed(){
        console.log('Electrical speed');
    }
}

let elec = new Electrical();

let robots:Robot[] = [car,elec]
robots.forEach(i => {
    i.speed()
})

this 类型

本质上是原型链的调用

  • 实现实例方法的链式调用

  • 在继承时,具有多态性,保持父子类之间接口调用的连贯性

类与接口的关系

  • 类实现接口的时候,必须实现接口中所有的属性

  • 可以实现自己的属性

  • 接口只能约束类的公有public成员

  • 接口也不能约束类的构造函数

  • 接口继承

    • 接口可以继承接口,实现接口的复用

    • 接口继承类,不能继承带有私有属性和受保护成员的类

总结

本篇罗列了接口、函数、类,写的非常详细了,仔细琢磨

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安卓APP源码和设计报告——个人通讯录

摘 要 随着移动设备制造技术和移动通信网络的迅猛发展,全球手机用户日益增加,手机成为了很多人日常生活中必不可少的一部分,手机业在日益发展的同时,人们对手机的功能需求和体验需求也越来越高,因此各种智能手机相继而出,当前市场上最流行的智能手机的操作系统非An…

RabbitMQ--重试机制

原文网址:RabbitMQ--重试机制_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍RabbitMQ的重试机制。 问题描述 消费者默认是自动提交,如果消费时出现了RuntimException,会导致消息直接重新入队,再次投递(进入队首&am…

【iOS】—— MVVM模式

MVVM模式 文章目录MVVM模式为什么使用MVVM?MVVM分别代表什么含义?MVVM通信关系MVVM模式的优缺点优点:缺点:概括总结MVVM文件分类为什么使用MVVM? iOS中,我们使用的大部分都是MVC架构。虽然MVC的层次明确,但是由于功能日…

C# 11新特性之file关键字

C#11 添加了文件作用域类型功能:一个新的 file 修饰符,可以应用于任何类型定义以限制其只能在当前文件中使用。这样,我们可以在一个项目中拥有多个同名的类。 目录示例file不可以与其他修饰符一起使用file可以修饰的类型file 不可修饰的类型f…

主流报表开发工具FastReport.Net全新发布,邀您体验最新版试用

FastReport .Net是一款适用于 WinForms、Blazor Server、ASP.NET、MVC、.NET 6 和 .NET Core 的报告生成工具。FastReport代表着“速度”、“可靠”和“品质”,是当今主流的报表开发工具。 该产品在本月进行了重大版本v2023的发布,接下来让我们一起看看…

【OpenCV-Python】教程:4-9 特征匹配 match

OpenCV Python 特征匹配 【目标】 特征匹配Brute-Force Matcher 和 FLANN Matcher 【理论】 Brute-Force Matcher字面意思是蛮力匹配器,所以它的过程也很简单,从一个集合里取出一个特征描述子,然后与第二个集合里的特征逐个的进行匹配比较…

传统MES架构的智能化改进---python在Aprol上的实践

一、开题依据 MES是属于生产车间级的管理信息系统。作为生产与计划之间的信息“集线器”,MES 主要包括以下功能模块:工序详细调度、资源分配和状态管理、生产单元分配、过程管理、人力资源管理、维护管理、质量管理、文档控制、产品跟踪和产品清单管理、…

Solidworks导出为URDF用于MoveIT总结(带prismatic)

环境 Solidwoks2018 SP0 / Solidwoks2021 SP5;Ubuntu20.04;ROS1 Noetic; Solidwoks2018 SP0对于平移副有问题,显示不出来,Solidwoks2021 SP5没有问题。 官网有段话: There is a known STL export bug with SolidWork…

Jdk Tomcat 安装教程 — 2022.12.11

文章目录一、安装jdk教程二、tomcat 安装三、修改Tomcat端口号安装Tomcat之前要确保安装jdk一、安装jdk教程 安装vim命令包,此操作如果执行不了,需要使用root权限执行 执行如下命令: yum install -y vim-enhanced2. 下载jdk安装包&#xff…

3D打印切片软件Cura入门

安装好之后,添加一台打印机,参数可以随便设置。 Cura安装包: 链接:https://pan.baidu.com/s/1T1MBcZYBCVfhtFKDBjypmQ?pwd2022 提取码:2022 基本操作 按住鼠标右键不放:旋转 按住滚轮不放&#xff1…

制作USB启动盘(U盘安装ubuntu20.04)

文章目录制作USB启动盘(U盘安装ubuntu20.04)制作USB启动盘的工具ubuntu20.04系统安装u盘制作进入bios制作USB启动盘(U盘安装ubuntu20.04) 制作USB启动盘的工具 制作USB启动盘的工具有rufus,UNetbootin,Un…

汇编语言—第1章 各类存储芯片及内存空间

1、各类存储器芯片 一台PC机中,装有多个存储类芯片,这些存储器芯片从物理连接上来看是独立的、不同的器件。 (1)随机存储器 用于存放供CPU使用的绝大部分程序和数据 (2)装有BIOS(Basic Input/Ou…

AI遮天传 DL-反馈神经网络RNN

本文会先介绍动态系统的概念,然后介绍两种简单的反馈神经网络,然后再介绍两种门控神经网络(LSTM, GRU),最后是关于反馈神经网络的应用(本次以语音识别为例)。 RNN: Recurrent neural network,一般叫它“反馈神经网络”或者“循环神…

1565_AURIX_TC275_开关电源模式相关寄存器

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这个寄存器可以设置开关电源的开关频率,之前在文档中看到过这个默认的数值是1.5M的频率,现在看来应该是这个1.56M的一个近似了。准确的数值不是1.5M而是1.56M。 1. …

任务四:标准化组织概览

标准化组织概览一、标准化组织1、ITU电信标准化部门无线电通信部门电信发展部门2、3GPP3、3GPP24、CCSA二、TDD-LTE与FDD-LTE系统的对比三、LTE技术特点及基本指标1、LTE主要技术特点2、峰值数据速率3、控制面延迟4、用户面延迟5、用户吞吐量6、频谱效率7、移动性8、覆盖9、频谱…

同事跳槽拿下阿里 P6Offer,程序员:会点基础还真不行

前阵子,同事程序员 H 偷偷的向阿里菜鸟投递了自己的简历... 不久后程序员 H 就收到了阿里菜鸟的面试通知,经历 5 轮面试,一举成功拿下 offer 并定级 P6。 小天趁着未来的阿里大佬还在身边,向程序员 H 讨教了一下面试阿里菜鸟的经…

法则三:架构师如何在一定时间内最大化自己的增量价值

法则三:架构师如何在一定时间内最大化自己的增量价值 作为一个架构师,必须要创造足够的商业价值,才能保障自己职业的长期。 那么你作为架构师,该如何为你的公司、部门或团队提供可量化的增量价值呢? 主要有扩大收入与…

2022.12.11 学习周报

文章目录摘要文献阅读1.题目2.摘要3.传统RNN存在的问题4.RNN与IndRNN的对比4.1 隐含层状态更新公式4.2 结构示意图4.3 IndRNN的优势5.IndRNN的分析5.1 RNN5.2 LSTM5.3 IndRNN的初始化5.4 梯度截断5.5 IndRNN6.实验结果6.1 Adding Problem6.2 Sequential MNIST Classification6.…

Spring 体系常用项目

如今做Java尤其是web几乎是避免不了和Spring打交道了,但是Spring是这样的大而全,新鲜名词不断产生,学起来给人一种凌乱的感觉,我就在这里总结一下,理顺头绪。 Spring Spring 概述 Spring 是一个开源框架&#xff0c…

R语言学习笔记——基础篇:第六章-基本图形

R语言 R语言学习笔记——入门篇:第六章-基本图形 文章目录R语言一、条形图1.1、垂直与水平条形图补——数据为因子时绘制垂直与水平条形图1.2、堆砌条形图与分组条形图1.3、数据整合条形图1.4、条形图的微调1.5、棘状图二、饼图三、直方图四、核密度图4.1、简易核密…