关于TypeScript Interface你需要知道的10件事

图片

TypeScript接口的10种使用场景——可能只有20%的web开发人员完全掌握它们

TypeScript中的接口是一个非常灵活的概念。除了抽象类的部分行为外,它还经常用于描述“对象的形状”。

必需的属性
 

在定义接口时,需要使用 interface 关键字:

interface User {  name: string;  sex: string;}​​​
const user: User = {  name: "Bytefer",  sex: "male",};

在上面的代码中,我们定义了一个 User 接口。然后定义一个 user 变量,并将其类型设置为 User 类型。但是,如果给 user 变量赋值时如果缺少相关的属性,TypeScript编译器会提示相关的错误。例如,在下面的代码中,我们在赋值时缺少 sex 属性:

图片

那么如何解决上述错误呢? 解决方案之一是在定义接口时使用 ? 声明一些属性是可选的。


可选属性

interface User {  name: string;  sex?: string;}
let user: User = { // OK  name: "Bytefer",};​​​​​user = { // Ok  name: "Bytefer",  sex: "male",};

这样在赋值是不管有没有 sex 属性就都不会报错了。

那么是否可以添加未声明的属性呢?

图片

从上图可以看出,当使用对象字面量赋值时,包括未声明的 age 属性,也会出现错误。解决这个问题最简单的方法是在 User 类型中添加 age 属性:

interface User {  name: string;  sex?: string;  age: number;}

虽然这种解决方案可以解决问题,但是如果我们想要添加其他任意属性,这种方式就不是很好了。为了满足上述要求,我们可以使用索引签名。

索引签名
 

索引签名的语法如下:

图片

键的类型只能是字符串、数字、符号或模板文字类型,而值的类型可以是任何类型。

图片

现在我们理解了索引签名的语法,让我们来更新 User 类型:

interface User {  name: string;  sex?: string;  [propName: string]: any; // Index Signatures}

在更新了 User 类型,并添加了新的 age 和 email 属性之后,TypeScript编译器就不会提示错误了。

let user: User = {  name: "Bytefer",  sex: "male",  age: 30,  email: "bytefer@gmail.com"};


只读的属性
 

在web系统中,我们需要区分不同的用户,一般来说,我们会使用 id 属性来识别不同的用户。此属性由Web系统自动生成,用户不能修改。对于上面的场景,我们可以使用 readonly 修饰符来定义只读属性。

图片

除了属性,对象还可以包含方法。当使用接口定义对象类型时,还可以声明同时存在于对象上的方法:

interface User {  id: string;  name: string;  say(words: string): void;}​​​let user: User = {  id: "6666",  name: "Bytefer",  say(words: string) {    console.log(words);  },};


调用签名
 

描述函数最简单的方法是使用函数类型表达式。这些类型在语法上类似于箭头函数:

const log: (msg: string) => void = (msg: string) => {  console.log(msg);};
log("Bytefer");

语法 (msg: string) => void 表示“具有一个名为 msg 的字符串类型参数的函数,该函数没有返回值”。当然,我们可以使用类型别名来命名函数类型:

type LogFn = (msg: string) => void;
 
const log: LogFn = (msg: string) => {  console.log(msg);};

如果我们想用属性描述一些可调用的东西,函数本身也是一个对象。那么函数类型表达式就不能满足这个要求。对于这种情况,我们可以在定义对象类型时使用调用签名:

图片

需要注意的是,在声明调用签名时,还支持重载:​​​​​​

interface Logger {  type: string;  (msg: string): void;  (msg: string, timestamp: number): void  (msg: string, timestamp: number, module: string): void}


构造签名

除了直接调用函数外,还可以使用 new 操作符来调用函数,这些函数通常称为构造函数。我们可以通过在调用签名前添加 new 关键字来编写构造签名:

interface PointConstructor {  new (x: number, y: number): { x: number; y: number };}​​​​​​function createPoint(ctor: PointConstructor,   x: number = 0, y: number = 0) {  return new ctor(x, y);}​​​​​​class Point {  constructor(public x: number, public y: number) {}}​​​​​​const zero = createPoint(Point);console.log(zero);


混合类型
 

因此,在定义接口时,我们可以同时使用调用签名和构造签名吗? 答案是肯定的,我们常用的 Date 对象,它的类型是 DateConstructor ,其中调用签名和构造签名都被使用:

declare var Date: DateConstructor;

图片

在上面的代码中,除了调用签名和构造签名之外,还定义了 Date 构造函数的属性和方法。

通用接口
 

泛型类型也可以与接口一起使用。下面是一个通用接口。

interface KeyPair<T, U> {  key: T;  value: U;}
let kv1: KeyPair<number, string> = { key: 1, value: "Bytefer" };


扩展接口

接口可以扩展一个或多个接口。这使得编写接口变得灵活和可重用。

interface Point1D {  x: number;}interface Point2D extends Point1D {  y: number;}interface Point3D extends Point2D {  z: number;}​​​​​​​const point1D = { x: 0 };const point2D = { x: 0, y: 0 };const point3D = { x: 0, y: 0, z: 0 };

除了扩展单个接口,TypeScript还允许我们扩展多个接口:​​​​​​​

interface CanSay {   say(words: string) :void }​​​​​​interface CanWalk {  walk(): void;}​​​​​​interface Human extends CanSay, CanWalk {  name: string;}


扩展类
 

在声明接口时,我们可以扩展一个或多个接口。实际上,我们也可以扩展已声明的类:​​​​​​​

class Point1D {  public x!: number;}​​​​​​interface Point2D extends Point1D {  y: number;}
const point2D: Point2D = { x: 0, y: 0 }

对于一个类,在声明该类时,可以同时实现多个接口:​​​​​​​

interface CanSay {   say(words: string) :void }​​​​​​​interface CanWalk {  walk(): void;}​​​​​​​class Person implements CanSay, CanWalk {  constructor(public name: string) {}    public say(words: string) :void {    console.log(`${this.name} says:${words}`);    }    public walk(): void {    console.log(`${this.name} walk with feet`);  }

对于TypeScript开发者来说,接口和类型有很多相似之处,当然也有一些不同之处,需要根据场景灵活运用。

 欢迎关注公众号:文本魔术,了解更多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/320924.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux——搭建KVM环境

KVM虚拟化 一、安装所需软件 1、yum安装软件 [rootlocalhost ~]# yum -y install qemu-kvm qemu-kvm-tools virt-install qemu-img bridge-utils libvirt virt-manager 重新启动 [rootlocalhost ~]reboot 2、查看CPU是否支持虚拟化 [rootlocalhost ~]# cat /proc/cpuinf…

【自动化测试】转行人员在面试中被问及计算机基础知识该怎么办??????(长文,预计三小时阅读)

看前提示&#xff0c;本文共4W字&#xff0c;76道题&#xff08;附答案&#xff09; 全部看完预计三个小时&#xff0c;如果觉得时间长&#xff0c;可以直接跳转到文末&#xff0c;有本文的word版提供下载 近些年软件测试岗位从转行的来人越来越多&#xff0c;占比高达44% 软件…

覆盖与交换-第四十二天

目录 内存空间的扩充 覆盖技术 实例 交换技术 思考 本节思维导图 内存空间的扩充 历史背景&#xff1a;早期计算机内存很小&#xff0c;内存大小不够的情况解决办法&#xff1a;后来人们引入了覆盖技术&#xff0c;用来解决“程序大小超过物理内存总合”的问题 覆盖技术…

《论文阅读》基于情绪-原因转换图的共情回复生成

《论文阅读》基于情绪-原因转换图的共情回复生成 前言摘要模型架构图构建回复概念预测回复生成前言 今天为大家带来的是《EMPATHETIC RESPONSE GENERATION VIA EMOTION CAUSE TRANSITION GRAPH》 出版: 时间:2023.2.23 类型:共情对话生成 关键词:图网络;共情回复;情绪…

【稳定检索 | 投稿优惠】2024年创意产业与商业发展国际学术会议(IACCIBD 2024)

2024年创意产业与商业发展国际学术会议(IACCIBD 2024) 2024 International Academic Conference on Creative Industries and Business Development (IACCIBD) 一、【会议简介】 2024年&#xff0c;一场盛大的国际学术会议将在中国上海隆重召开&#xff0c;那就是“2024年创意产…

知虾会员**成为知虾会员,尊享专属权益**

在当今繁忙的生活中&#xff0c;线上购物已经成为现代人们的主要消费方式之一。而作为线上购物平台的领军者之一&#xff0c;Shopee为了提供更加个性化和便利的购物体验&#xff0c;推出了知虾会员&#xff08;Shopee会员&#xff09;服务。知虾会员不仅可以享受到一系列会员专…

网络连通性批量检测工具

一、背景介绍 企业网络安全防护中&#xff0c;都会要求配置物理网络防火墙以及主机防火墙&#xff0c;加强对网络安全的防护。云改数转之际&#xff0c;多系统上云过程中都会申请开通大量各类网络配置&#xff0c;针对这些复杂且庞大的网络策略开通配置&#xff0c;那么在网络配…

C# 全屏label控件实现的贪吃蛇。

C# 全屏label控件实现的贪吃蛇。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using stat…

鸿蒙(OpenHarmony)系统之智能语音部件(1)

本文重点参考&#xff1a; OpenHarmony/ai_intelligent_voice_framework 一、总体概述 1. 功能简介及架构 智能语音组件包括智能语音服务框架和智能语音驱动&#xff0c;主要实现了语音注册及语音唤醒相关功能。 智能语音组件架构图如下图所示&#xff1a; &#xff08;1&a…

Go中interface != nil不一定不是nil

摘要&#xff1a; interface{} 值 ! nil不一定不是nil&#xff0c;应使用reflect库判断是否是nil。 测试示例&#xff1a; // todo interface ! nil 不一定 不是nil var value map[string]interface{} reqMap : make(map[string]interface{}) reqMap["key"] valu…

计算机丢失VCRUNTIME140_1.dll怎么办,6个不同方法教你解决问题

一、什么是vcruntime140_1.dll&#xff1f; vcruntime140_1.dll是Visual C Redistributable Packages的一部分&#xff0c;它是Microsoft Visual Studio开发环境中使用的运行时库文件。它包含了许多常用的函数和类&#xff0c;为开发者提供了丰富的功能支持。 二、vcruntime1…

听GPT 讲Rust源代码--compiler(9)

File: rust/compiler/rustc_trait_selection/src/traits/select/mod.rs 在Rust源代码中&#xff0c;rust/compiler/rustc_trait_selection/src/traits/select/mod.rs文件的作用是实现Rust编译器的trait选择器。 首先&#xff0c;让我们逐个介绍这些struct的作用&#xff1a; Se…