对TS里接口、extends和类的理解

简介: 对TS里接口、extends和类的理解

对TS里接口和类的理解

接口

  • 需求: 创建人的对象, 需要对人的属性进行一定的约束

  • 下面通过一个简单示例来观察接口是如何工作的:

/* 
在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型
接口: 是对象的状态(属性)和行为(方法)的抽象(描述)
接口类型的对象
    多了或者少了属性是不允许的
    可选属性: ?
    只读属性: readonly
*/

/* 
需求: 创建人的对象, 需要对人的属性进行一定的约束
  id是number类型, 必须有, 只读的
  name是string类型, 必须有
  age是number类型, 必须有
  sex是string类型, 可以没有
*/

// 定义人的接口
interface IPerson {
   
  id: number
  name: string
  age: number
  sex: string
}

const person1: IPerson = {
   
  id: 1,
  name: 'tom',
  age: 20,
  sex: '男'
}
  • 应用
  • 定义一个Person 接口,它来描述一个拥有 firstName 和 lastName 字段的对象,这两个元素的值均为string类型。(对函数 greeterinterface 的参数person对象的元素类型进行了限制。)
interface Person {
   
    firstName: string;
    lastName: string;
}

const greeterinterface = (person: Person) => {
   
    return "Hello, " + person.firstName + " " + person.lastName;
}

let user = {
    firstName: "Jane", lastName: "User" };

console.log(greeterinterface(user))
  • 在项目里使用,例如调一个接口你需要传一个object给后端,这个object的元素有name,age,height,我们可以通过接口来对object值统一进行一个限制,name必须是string,age和height必须是number,否则就报错,这样会使代码更加严谨。

    extends 关键字

在 TypeScript 中,通过 extends 关键字可以实现接口的继承。即用一个接口来扩展另一个接口的成员。这样可以避免重复定义或者让接口更加灵活。

interface Shape {
   
  name: string;
  area(): number;
}

interface Circle extends Shape {
   
  radius: number;
}

class MyCircle implements Circle {
   
  name = "My Circle";
  radius = 10;
  area() {
   
    return Math.PI * Math.pow(this.radius, 2);
  }
}

const myCircle = new MyCircle();
console.log(myCircle.name); // "My Circle"
console.log(myCircle.area()); // 314.1592653589793

在上述代码中,定义了两个接口Shape和Circle。

接口Shape定义了name和area两个属性。

接口Circle继承了Shape接口(Circle也拥有了来自Shape接口的两个属性),并增加了radius属性

这就是 extends的使用,用于继承,并且在继承属性的基础上又新增了自己的属性

接下来,通过class关键字定义了一个MyCircle类,这个类通过接口继承,实现了接口的组合和复用。

  • 在 TypeScript 中,类是面向对象编程的基础,它是一种抽象和封装了数据和行为的结构。类具有属性和方法,通常用于创建对象

  • 下面是一个简单的 TypeScript 类的示例:

class Person {
   
  name: string;
  age: number;

  constructor(name: string, age: number) {
   
    this.name = name;
    this.age = age;
  }

  sayHello() {
   
    console.log(`Hello, my name is {
   mathJaxContainer[0]}{
   this.age} years old.`);
  }
}

const person = new Person("Tom", 18);
person.sayHello();

上面的代码中,定义了一个 Person 类,其中包括 name 和 age 两个属性,以及 sayHello 方法。在 constructor 构造函数中,通过 this关键字来初始化 name 和 age 两个属性。sayHello 方法用于输出 Person 对象的信息。

在最后的代码中,创建了一个名为 person 的 Person 对象,调用其 sayHello 方法,输出 Hello, my name is Tom and I am 18 years old.。

目录
相关文章
|
JavaScript 前端开发 开发者
vue的slot插槽详解
vue的slot插槽详解
236 0
|
前端开发 应用服务中间件 nginx
Javaweb之前端工程打包部署的详细解析
6 打包部署 我们的前端工程开发好了,但是我们需要发布,那么如何发布呢?主要分为2步: 前端工程打包 通过nginx服务器发布前端工程 6.1 前端工程打包
377 0
Javaweb之前端工程打包部署的详细解析
|
8月前
|
网络协议 Java 开发工具
全平台开源即时通讯IM框架MobileIMSDK:7端+TCP/UDP/WebSocket协议,鸿蒙NEXT端已发布,5.7K Stars
全平台开源即时通讯IM框架MobileIMSDK:7端+TCP/UDP/WebSocket协议,鸿蒙NEXT端已发布,5.7K Stars
484 1
|
6月前
|
缓存 监控 JavaScript
HarmonyOSNext应用无响应全解析:从机制到实战的卡死问题排查
本文深入解析HarmonyOS Next中应用无响应的卡死问题,涵盖THREAD_BLOCK_6S、APP_INPUT_BLOCK与LIFECYCLE_TIMEOUT三种常见类型,结合日志分析与实战案例,手把手教你快速定位并解决主线程阻塞、输入事件卡顿及生命周期超时问题,适用于Stage模型开发者学习使用。
403 0
|
5月前
|
缓存
|
缓存 关系型数据库 MySQL
Mac安装brew
Mac安装brew
1784 6
|
JavaScript 前端开发 编译器
TypeScript中的高级类型:联合类型、交叉类型与条件类型深入解析
【4月更文挑战第23天】探索TypeScript的高级类型。这些特性增强类型系统的灵活性,提升代码质量和维护性。
|
Linux UED iOS开发
|
机器学习/深度学习 存储 算法
数据结构与算法——BFS(广度优先搜索)
数据结构与算法——BFS(广度优先搜索)
|
存储 JavaScript 前端开发
ts简介和基本类型
ts简介和基本类型