TS学习笔记(三)

类型缩小

我们可以通过类似于 typeof padding === “number” 的判断语句,来改变TypeScript的执行路径;
在给定的执行路径中,我们可以缩小比声明时更小的类型,这个过程称之为 缩小

常见的类型保护有如下几种:
typeof
平等缩小(比如= = =、= =、!= = 、switch)
instanceof
in(如果指定的属性在指定的对象或其原型链中,返回true;)
等等…

函数类型

下面(num1: number, num2: number) => void,代表的就是一个函数类型:
接收两个参数的函数:num1和num2,并且都是number类型;
并且这个函数是没有返回值的,所以是void;
在某些语言中,可能参数名称num1和num2是可以省略,但是TypeScript是不可以的
函数类型
参数可选
我们可以指定某个参数是可选的,但是可选类型必须在必传参数的后面
参数可选
默认参数
这个时候y的类型其实是 undefined 和 number 类型的联合
默认参数
剩余参数
剩余参数语法允许我们将一个不定数量的参数放到一个数组中
剩余参数

this相关

面试this指路链接

可推导的this类型

TypeScript认为函数 sayHello 有一个对应的this的外部对象 info,所以在使用时,就会把this当做该对象。
在这里插入图片描述

不确定的this类型

下面代码运行会报错的:
TypeScript进行类型检测的目的是让我们的代码更加的安全,所以这里对于 sayHello 的调用来说,我们虽然将其放到了info中,通过info去调用,this依然是指向info对象的;
但是对于TypeScript编译器来说,这个代码是非常不安全的,因为我们也有可能直接调用函数,或者通过别的对象来调用函数:
在这里插入图片描述

指定this的类型

这个时候,通常TypeScript会要求我们明确的指定this的类型:
在这里插入图片描述

函数的重载

函数的重载:函数的名称相同,但是参数不同(个数或者类型)的几个函数,就是函数的重载。
ts里如果我们编写了一个add函数,希望可以对字符串和数字类型进行相加,下面会报错:
在这里插入图片描述
解决:
我们可以去编写不同的重载签名来表示函数可以以不同的方式进行调用;
函数的实现体是写在声明下面的,由上而下执行
重载
函数的重截中,实现函数是不能直被调用的
在这里插入图片描述

联合类型和重载

有一个需求:定义一个函数,可以传入字符串或者数组,获取它们的长度。
这里有两种实现方案:
方案一:使用联合类型来实现;
在这里插入图片描述

方案二:实现函数重载来实现;
在这里插入图片描述
当然这种返回值类型确定的,尽量选择使用联合类型来实现

在早期的JavaScript开发中(ES5)我们需要通过函数和原型链来实现类和继承,从ES6开始,引入了class关键字,可以更加方便的定义和使用类。
TypeScript作为JavaScript的超集,也是支持使用class关键字的,并且还可以对类的属性和方法等进行静态类型检测

类的定义 class

类的定义

类的继承extends

我们使用extends关键字来实现继承,子类中使用super来访问父类

Student类继承自Person:
Student类可以有自己的属性和方法,并且会继承Person的属性和方法
在构造函数中,我们可以通过super来调用父类的构造方法,对父类中的属性进行初始化;
只要在子类中我们使用了constructor,那么我们就要在子类中写 super,哪怕父类没写构造器
继承
子类如果有和父类相同的方法则会重写
继承
多态
看上去是相同的类型,实际表现出来是不一样的
多态的目的是为了写出更加具备通用性的代码
多态

类的成员修饰符

在TypeScript中,类的属性和方法支持三种修饰符: public、private、protected
public 修饰的是在任何地方可见、公有的属性或方法,默认编写的属性就是public的;
private 修饰的是仅在当前类中可见、私有的属性或方法;
protected 修饰的是仅在类自身及子类中可见、受保护的属性或方法;
public是默认的修饰符,也是可以直接访问的,我们这里来演示一下protected和private。

protected:
子类可以通过this访问到
protected
privite
取值可以用到getters/setters
privite

只读属性readonly

如果有一个属性我们不希望外界可以任意的修改,只希望确定值后直接使用,那么可以使用readonly
只读属性是可以在构造器中赋值,但赋值后就不可修改
readonly

返回器getters/setters

在前面一些私有属性我们是不能直接访问的,或者某些属性我们想要监听它的获取(getter)和设置(setter)的过程,
这个时候我们可以使用存取器。
在这里插入图片描述

const p= new Person("me")
p.name ="myname"
console.log(p.name)

静态成员 static

前面我们在类中定义的成员和方法都属于对象级别的(new出来访问), 在开发中, 我们有时候也需要定义类级别的成员和方法。
通过类名直接访问:
在这里插入图片描述

抽象类abstract

继承是多态使用的前提。
所以在定义很多通用的调用接口时, 我们通常会让调用者传入父类,通过多态来实现更加灵活的调用方式。

但是,父类本身可能并不需要对某些方法进行具体的实现,所以父类中定义的方法,我们可以定义为抽象方法。

什么是 抽象方法? 在TypeScript中没有具体实现的方法(没有方法体),就是抽象方法。(默认函数必须有实现体)
抽象方法,必须存在于抽象类中
抽象类是使用abstract声明的类;
抽象类有如下的特点:
抽象类是不能被实例化的(也就是不能通过new创建)
抽象方法必须被子类实现,否则报错。(或者把该子类也写成一个抽象类)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

类的类型

类本身也是可以作为一种数据类型,上面也可以看出…
类的类型

TS学习笔记(完结)

指路 TS学习笔记(完结)~

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来回答你关于 TypeScript Symbol 和模块的问题。 首先,Symbol 是 TypeScript 的一种新的基本数据类型,它可以用来创建唯一的标识符。在 TypeScript ,Symbol 主要有两种用法: 1. 作为对象属性的键值,用来表示一个对象属性的唯一标识符。 2. 作为一个类的静态属性或方法,用来表示该类的唯一标识符。 下面是一个使用 Symbol 作为对象属性键值的示例: ```typescript const key = Symbol('myKey'); const obj = { [key]: 'value' }; console.log(obj[key]); // 输出'value' ``` 在上面的代码,我们使用 Symbol('myKey') 创建了一个新的 Symbol,然后将该 Symbol 作为对象 obj 的属性键值,并赋值为'value'。最后,我们通过 obj[key] 的方式来访问该属性,并输出了'value'。 另外,模块是 TypeScript 的另一个重要概念,它用来组织和管理代码。在 TypeScript ,模块可以使用 import 和 export 命令来进行导入和导出。下面是一个使用模块的示例: ```typescript // moduleA.ts export const num = 123; // moduleB.ts import { num } from './moduleA'; console.log(num); // 输出123 ``` 在上面的代码,我们定义了一个名为 num 的常量,并将其导出。然后,在另一个模块,我们使用 import 命令将 num 导入,并通过 console.log 输出了它的值。 这就是关于 TypeScript Symbol 和模块的简单介绍,希望能对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值