携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第31天,点击查看活动详情
前言
大家好呀,我是L同学。在上篇文章TypeScript学习笔记(四)中,我们学习了TypeScript的相关知识点,包括函数类型的基本使用、void 类型、可选参数、参数默认值等相关知识点。在本篇文章中,我们将学习TypeScript的相关知识点,包括对象可选属性、使用类型别名、接口、interface和type对比、接口继承、元组类型等内容。
对象类型
对象可选属性
对象的属性或方法,也可以是可选的,此时就用到可选属性了。比如,我们在使用 axios({ ... }) 时,如果发送 GET 请求,method 属性就可以省略。可选属性的语法与函数可选参数的语法一致,都使用 ? 来表示。
type Config = {
url: string
method?: string
}
function myAxios(config: Config) {
console.log(config)
}
使用类型别名
直接使用 {} 形式为对象添加类型,会降低代码的可读性(不好辨识类型和值)。可以使用类型别名为对象添加类型。
// 创建类型别名
type Person = {
name: string
sayHi(): void
}
// 使用类型别名作为对象的类型:
let person: Person = {
name: 'jack',
sayHi() {}
}
接口
当一个对象类型被多次使用时,一般会使用接口(interface)来描述对象的类型,达到复用的目的。使用 interface 关键字来声明接口。接口名称(比如,IPerson),可以是任意合法的变量名称,推荐以 I 开头。声明接口后,直接使用接口名称作为变量的类型。因为每一行只有一个属性类型,因此,属性类型后没有 ;(分号)。
interface IPerson {
name: string
age: number
sayHi(): void
}
let person: IPerson = {
name: 'jack',
age: 19,
sayHi() {}
}
interface和type对比
interface(接口)和 type(类型别名)的对比:
相同点:都可以给对象指定类型。
不同点:
- 接口,只能为对象指定类型
- 类型别名,不仅可以为对象指定类型,实际上可以为任意类型指定别名
推荐:能使用 type 就是用 type。
interface IPerson {
name: string
age: number
sayHi(): void
}
// 为对象类型创建类型别名
type IPerson = {
name: string
age: number
sayHi(): void
}
// 为联合类型创建类型别名
type NumStr = number | string
接口继承
如果两个接口之间有相同的属性或方法,可以将公共的属性或方法抽离出来,通过继承来实现复用。比如,这两个接口都有 x、y 两个属性,重复写两次,可以,但很繁琐。
interface Point2D { x: number; y: number }
interface Point3D { x: number; y: number; z: number }
更好的方式是使用 extends(继承)关键字实现接口 Point3D 继承 Point2D。继承后,Point3D 就有了 Point2D 的所有属性和方法(此时,Point3D 同时有 x、y、z 三个属性)。
interface Point2D { x: number; y: number }
// 继承 Point2D
interface Point3D extends Point2D {
z: number
}
元组类型
在地图中,使用经纬度坐标来标记位置信息。可以使用数组来记录坐标,那么,该数组中只有两个元素,并且这两个元素都是数值类型。
let position: number[] = [116.2317, 39.5427]
使用 number[] 的缺点:不严谨,因为该类型的数组中可以出现任意多个数字。更好的方式:元组 Tuple。元组类型是另一种类型的数组,它确切地知道包含多少个元素,以及特定索引对应的类型。元组类型可以确切地标记出有多少个元素,以及每个元素的类型。
该示例中,元素有两个元素,每个元素的类型都是 number。
let position: [number, number] = [39.5427, 116.2317]