TypeScript学习笔记(五)

92 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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]