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

news2024/11/29 8:43:55

图片

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.coloradmin.cn/o/1356517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

流量困境下,2024年餐饮商家的直播带货生意到底怎么做?

据官方数据显示&#xff0c;截至2023年2月&#xff0c;抖音生活服务餐饮商家直播间数量达到43万&#xff0c;2023年7月&#xff0c;抖音生活服务餐饮行业自播商家数较1月增长134%。可以说&#xff0c;直播带货已经成为餐饮商家的常态化的线上营销模式&#xff0c;也成为各大餐饮…

SwiftUI之深入解析ContentUnavailableView的实战应用

一、基本用法 SwiftUI 引入了新的 ContentUnavailableView 类型&#xff0c;允许在应用程序中展示空状态、错误状态或任何其他内容不可用的状态。那么&#xff0c;如何使用 ContentUnavailableView 引导用户浏览应用程序中的空状态呢&#xff1f;首先看看 ContentUnavailableV…

redis服务迁移数据工具--RDM

一、背景&#xff1a; 在日常的运维工作经常遇见各种数据迁移工作&#xff0c;例如mysql数据库迁移、redis数据库迁移、minio数据迁移等等工作。这里介绍一下redis数据库的迁移过程。 二、迁移思路&#xff1a; redis服务/集群的数据迁移思路是需要新建一个配置、密码一样的re…

NX/UG二次开发—C\C++开发单个DLL支持多版本NX一种方法

1、去除附加包含目录下的NX相关的lib文件&#xff1a; 2、从对应的dll导出ufun函数和NXopen函数&#xff1a; libufun.dll; libufun_cam.dll; libufun_cae.dll; libufun_die.dll; libufun_vdac.dll; libufun_weld.dll; libugopenint.dll; libugopenint_cae.dll; libugopenint_…

感知与认知的碰撞,大模型时代的智能文档处理范式

目录 0 写在前面1 GPT4-V&#xff1a;拓宽文档认知边界2 大语言模型的文档感知缺陷3 大一统文档图像处理范式3.1 像素级OCR任务3.2 OCR大一统模型3.3 长文档理解与应用 4 总结抽奖福利 0 写在前面 由中国图象图形学学会青年工作委员会发起的第十九届中国图象图形学学会青年科学…

Java重修第一天—学习数组

1. 认识数组 建议1.5倍速学习&#xff0c;并且关闭弹幕。 数组的定义&#xff1a;数组是一个容器&#xff0c;用来存储一批同种类型的数据。 下述图&#xff1a;是生成数字数组和字符串数组。 为什么有了变量还需要定义数组呢&#xff1f;为了解决在某些场景下&#xff0c;变…

chromium在中文用户名下无法编译的问题

新电脑没有太注意&#xff0c;起用户名的时候用了中文。 在编译chromium104的代码时&#xff0c;因为环境变量有中文导致编译失败&#xff1a; 因为我的电脑默认是使用gbk编码&#xff0c;而不是utf-8编码。 这个问题有三种解决办法&#xff1a; &#xff08;一&#xff09;把…

【Spark精讲】Spark on Hive性能优化

目录 第一章 1.1 集群配置概述 1.2 集群规划概述 第二章 Yarn配置 2.1 Yarn配置说明 yarn.nodemanager.resource.memory-mb yarn.nodemanager.resource.cpu-vcores yarn.scheduler.maximum-allocation-mb yarn.scheduler.minimum-allocation-mb 第三章 Spark的配置说…

在Ubuntu22.04上部署Stable Diffusion

在AI绘画软件领域Stable-Diffusion&#xff08;简称SD&#xff09;在开源领域绝对是不二之选&#xff0c;他的插件方式可以让此软件具有更多的功能&#xff0c;开发者社群为此提供了大量免费高质量的外接预训练模型&#xff08;fine-tune&#xff09;和插件&#xff0c;并持续维…

深耕汽车检测设备领域,引领行业技术革新

在汽车工业飞速发展的今天&#xff0c;汽车检测技术作为保障车辆安全、提升维修效率的重要手段&#xff0c;日益受到行业内外的高度关注。康士柏汽车检测线设备厂家&#xff0c;作为这一领域的佼佼者&#xff0c;凭借其深厚的技术积累和卓越的产品品质&#xff0c;正引领着行业…

傅里叶级数、傅里叶变换、小波变换、离散余弦变换的理解

目录 1. 傅里叶级数2.傅里叶变换 1. 傅里叶级数 功能&#xff1a;能把任意周期性函数展开成一系列正弦、余弦函数的和。 公式&#xff1a; f ( x ) a 0 2 ∑ n 1 ∞ ( a n cos ⁡ ( 2 π n x T ) b n sin ⁡ ( 2 π n x T ) ) 傅里叶系数 a n 2 T ∫ x 0 x 0 T f ( x )…

即时设计:一键查看设计稿与页面差异,让设计师的工作更便捷高效

设计稿走查 在设计工作中&#xff0c;对设计稿和实际页面进行对比是必不可少的环节。然而&#xff0c;传统的对比方式往往耗时耗力&#xff0c;无法精确测量差异。为了解决这个问题&#xff0c;我们推出了一款强大的工具&#xff0c;它可以通过图片对比&#xff0c;轻松查看设…

【ESP32接入语言大模型之通义千问】

1. 通义千问 讲解视频&#xff1a; ESP32接入语言大模型之通义千问 随着人工智能技术的不断发展&#xff0c;自然语言处理领域也得到了广泛的关注和应用。通义千问由阿里云开发&#xff0c;目标是帮助用户获得准确、有用的信息&#xff0c;解决他们的问题和困惑&#xff0c;也…

Debian12使用Xshell连接失败解决办法详细

1、Debian开启ssh服务 sudo apt update -y sudo apt install ssh2、编辑配置文件 # 安装vim sudo apt install vimvim /etc/ssh/sshd_config3、将#PermitRootLogin prohibit-password的注释去掉&#xff0c;设置为yes 4、将#PasswordAuthentication no的注释去掉&#xff0c;…

爬虫工具(tkinter+scrapy+pyinstaller)

需求介绍输入&#xff1a;关键字文件&#xff0c;每一行数据为一爬取单元。若一行存在多个and关系的关键字 &#xff0c;则用|隔开处理&#xff1a;爬取访问6个网站的推送&#xff0c;获取推送内容的标题&#xff0c;发布时间&#xff0c;来源&#xff0c;正文第一段&#xff0…

进程和计划任务-------后续(二)

一、进程管理 1.进程启动---------- 前台启动与后台启动 进程需要手动启动 前台启动&#xff08;运行&#xff09;&#xff1a;通过终端启动&#xff0c;且启动后一直占据终端&#xff08;影响当先终端的操作&#xff09; 后台启动&#xff1a;可通过终端启动&#xff0c;但启…

【KingbaseES】实现MySql函数Median

本方法只支持在聚合函数窗口中调用 不支持在GROUP BY中使用&#xff0c;使用plsql写的玩意新能都会稍微差一些 建议使用原生方法修改 CREATE OR REPLACE FUNCTION _final_median(numeric[])RETURNS numeric AS $$SELECT AVG(val)FROM (SELECT valFROM unnest($1) valORDER BY …

vue保姆级教程----深入了解 Vue3路由守卫

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

Power Automate删除SharePoint Online或OneDrive for Business文件版本历史

SharePoint Online和OneDrive for Business支持版本控制&#xff0c;可以保留文件的版本历史&#xff0c;方便用户随时查看和恢复以前的版本。但该功能也会占用大量SharePoint Online或OneDrive for Business存储空间。官方删除版本历史的方法无法批量操作&#xff0c;故今天提…

【linux学习】个人计算机架构

1. 个人计算机架构 个人计算机的架构通常是x86架构&#xff0c;主流的x86架构的CPU供应商主要为Intel。下图为Intel的主机板。 图1.1 主机板及其各组件 主机板上包括的组件有&#xff1a;CPU、主内存&#xff08;RAM&#xff09;、磁盘设备&#xff08;IDE/SATA&#xff09;、…