TypeScript 学习笔记(五):interface接口

前言

在上一篇文章中我们学习了TS中的数组和元组,本篇文章我们主要了解TS中的interface接口。

interface接口介绍

interface 是一种类型约定,中文译为"接口"。使用了这个interface的对象,就拥有了指定的类型结构。

TS 复制代码
interface Person {
  firstName: string;
  lastName: string;
}

上面示例中,定义了一个接口Person,它指定一个对象模板,拥有属性firstNamelastName任何实现这个接口的对象,都必须部署这两个属性。 如以下实例,变量p的类型就是接口Person,所以必须符合Person指定的结构,否则就会报错。

TS 复制代码
const p:Person = {
  firstName: 'Li',
  lastName: 'Xu',
};

interface 的使用

interface接口中,一般有着以下几类成员。

  • 对象属性
  • 对象的属性索引
  • 对象方法
  • 函数

对象属性

示例:

TS 复制代码
interface Point {
  x: number;
  y: number;
}

如果属性是可选的,就在属性名后面加一个问号。

TS 复制代码
interface Foo {
  x?: string;
}

如果属性是只读的,需要加上readonly修饰符。

TS 复制代码
interface A {
  readonly a: string;
}

对象的属性索引

TS 复制代码
interface A {
  [Key: string]: number;
}

上面示例中,[Key: string]就是属性的字符串索引,表示属性名只要是字符串,都符合类型要求。属性索引共有stringnumbersymbol三种类型。

对象方法

写法如下:

TS 复制代码
// 写法一
interface A {
  f(x: boolean): string;
}

// 写法二
interface B {
  f: (x: boolean) => string;
}

// 写法三
interface C {
  f: { (x: boolean): string };
}

这三种写法都定义了一个接受布尔类型参数并返回字符串类型的函数。

函数

interface也可以用来声明独立的函数。

TS 复制代码
interface Add {
  (x:number, y:number): number;
}

const myAdd:Add = (x,y) => x + y;

interface的继承

interface可以继承其他类型。

interface继承interface

interface可以使用extends关键字,继承其他interface

TS 复制代码
interface Shape {
  name: string;
}

interface Circle extends Shape {
  radius: number;
}

extends关键字会从继承的接口里面拷贝属性类型,这样就不必书写重复的属性。

而且interface还允许多重继承,如以下例子。

TS 复制代码
interface Style {
  color: string;
}

interface Shape {
  name: string;
}

interface Circle extends Style, Shape {
  radius: number;
}

如果子接口与父接口存在同名属性,那么子接口的属性会覆盖父接口的属性。但是子接口与父接口的同名属性必须是类型兼容的,不能有冲突。

TS 复制代码
interface Foo {
  id: string;
}

interface Bar extends Foo {
  id: number; // 报错
}

interface继承type

interface可以继承type命令定义的对象类型。如果type命令定义的类型不是对象,interface 就无法继承。

TS 复制代码
type Country = {
  name: string;
  capital: string;
}

interface CountryWithPop extends Country {
  population: number;
}

interface继承class

TS 复制代码
class A {
  x:string = '';

  y():boolean {
    return true;
  }
}

interface B extends A {
  z: number
}

interfacetype的区别

interface命令与type命令作用类似,都可以表示对象类型。

很多对象类型既可以用 interface 表示,也可以用 type 表示。而且,两者往往可以换用,几乎所有的 interface 命令都可以改写为 type 命令。

相同点

都能为对象类型起名。

TS 复制代码
type Country = {
  name: string;
  capital: string;
}

interface Country {
  name: string;
  capital: string;
}

不同点

  1. type能够表示非对象类型,而interface只能表示对象类型。
  2. interface可以继承其他类型,type不支持继承。
  3. 同名interface会自动合并,同名type则会报错。也就是说,TypeScript 不允许使用type多次定义同一个类型。
  4. interface不能包含属性映射,type可以。
  5. this关键字只能用于interface
  6. type 可以扩展原始数据类型,interface 不行。
相关推荐
徐同保22 分钟前
React useRef 完全指南:在异步回调中访问最新的 props/state引言
前端·javascript·react.js
刘一说1 小时前
Vue 导航守卫未生效问题解析:为什么路由守卫不执行或逻辑失效?
前端·javascript·vue.js
一周七喜h1 小时前
在Vue3和TypeScripts中使用pinia
前端·javascript·vue.js
weixin_395448912 小时前
main.c_cursor_0202
前端·网络·算法
东东5162 小时前
基于vue的电商购物网站vue +ssm
java·前端·javascript·vue.js·毕业设计·毕设
MediaTea2 小时前
<span class=“js_title_inner“>Python:实例对象</span>
开发语言·前端·javascript·python·ecmascript
梦梦代码精3 小时前
开源、免费、可商用:BuildingAI一站式体验报告
开发语言·前端·数据结构·人工智能·后端·开源·知识图谱
0思必得03 小时前
[Web自动化] Selenium执行JavaScript语句
前端·javascript·爬虫·python·selenium·自动化
程序员敲代码吗3 小时前
MDN全面接入Deno兼容性数据:现代Web开发的“一张图”方案
前端
0思必得03 小时前
[Web自动化] Selenium截图
前端·爬虫·python·selenium·自动化