TypeScript 中 interface 和 type 的使用#记录

一、interface:接口

interface A{label: string;
}const aa = ((aObj: A) => {console.log(aObj.label);//'123'return aObj.label;
})aa({label: '123'})

1、可选属性

interface A{label: string;age?: number;
}

2、只读属性

interface A{label: string;age?: number;readonly sex: string;
}

3、多余属性检查

interface A{label: string;age?: number;readonly sex: string;
}const aa = ((aObj: A) => {console.log(aObj.label);return aObj.label;
})aa({label: '123', age: 12, sex: '男',name: '123'})// 报错//避免以上报错只需加上[propName:strig]:any
interface B{label: string;age?: number;readonly sex: string;[propName:string]:any;
}const bb = ((aObj: B) => {console.log(aObj.label);return aObj.label;
})bb({label: '123', age: 12, sex: '男',name: '123'})// 正常

4、函数类型

interface A{(a:number,b:number):void;
}

5、索引类型

interface A{[index: number]: string
}const arr: A = ['a', 'b', 'c']

6、类类型接口

interface A{name: string;age: number;
}class B implements A{name: string;age: number;constructor(name: string, age: number){this.name = name;this.age = age;}sayHello(){console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);}
}const b = new B("Alice", 25);

7、继承多个接口

interface A{name: string;
}interface B{age: number;
}interface C extends A, B{gender: string;
}const c: C = {name: "John",age: 30,gender: "male"
}

二、type:类型别名

type 会给一个类型起个新名字。 type 有时和 interface 很像,但是可以作用于原始值(基本类型),联合类型,元组以及其它任何你需要手写的类型。

type A = stringtype B = () => numbertype C = A | Bconst c = ((value: C) =>{if (typeof value === 'string') {return value}return value()
})

1、同接口一样,类型别名也可以是泛型 - 我们可以添加类型参数并且在别名声明的右侧传入
 

type A<T> = { value: T };

2、也可以使用类型别名来在属性里引用自己

type A<T> = {value: T;a: A<T>;
}

3、与交叉类型一起使用,我们可以创建出一些十分稀奇古怪的类型。

type B<T> = T & { next: B<T> };interface C{name: string;
}let c: B<C>;
let s = c.name;
let s = c.next.name;
let s = c.next.next.name;
let s = c.next.next.next.name;

 4、类型别名不能出现在声明右侧的任何地方

type A= Array<A>; // 错误

三、interface和type区别

1、两者都可以用来描述对象或函数的类型,但是语法不同。

//interfaceinterface Point {x: number;y: number;
}interface SetPoint {(x: number, y: number): void;
}//typetype Point = {x: number;y: number;
};type SetPoint = (x: number, y: number) => void;

2、与接口不同,类型别名还可以用于其他类型

//基本类型和联合类型可以看上面举的例子// tuple
type Data = [number, string];// dom
let div = document.createElement('div');
type B = typeof div;

3、两者都可以扩展,但是语法又有所不同。此外,请注意接口和类型别名不是互斥的。接口可以扩展类型别名,反之亦然。

//1、接口继承接口interface PartialPointX { x: number; }
interface Point extends PartialPointX { y: number; }//2、类别集成类别type PartialPointX = { x: number; };
type Point = PartialPointX & { y: number; };//3、接口继承类别type PartialPointX = { x: number; };
interface Point extends PartialPointX { y: number; }//4、类别继承接口interface PartialPointX { x: number; }
type Point = PartialPointX & { y: number; };

4、接口可以定义多次,并将被视为单个接口(合并所有声明的成员)。

interface Point { x: number; }
interface Point { y: number; }const point: Point = { x: 1, y: 2 };

5、计算属性,生成映射类型

type 能使用 in 关键字生成映射类型,但 interface 不行。

type Keys = "firstname" | "surname"type DudeType = {[key in Keys]: string
}const test: DudeType = {firstname: "Pawel",surname: "Grzybek"
}// 报错
//interface DudeType2 {
//  [key in keys]: string
//}

 5、导出的时候也有不同

export default interface Config {name: string
}// export default type Config1 = {
//   name: string
// }
// 会报错type Config2 = {name: string
}
export default Config2

三、总结

类型:对象、函数两者都适用,但是 type 可以用于基础类型、联合类型、元祖。

同名合并:interface 支持,type 不支持。

计算属性:type 支持, interface 不支持。

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

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

相关文章

231 基于matlab的北斗信号数据解析

基于matlab的北斗信号数据解析&#xff0c;多通道和单通道接收到的北斗信号数据&#xff0c;利用接收到的北斗数据&#xff08;.dat .txt文件&#xff09;&#xff0c;进行解析&#xff0c;得到初始伪距&#xff0c;平滑伪距&#xff0c;载波相位&#xff0c;并计算其标准差&am…

翱途开发平台新手上路-体验APP移动手机办公

O2OA(翱途)开发平台拥有配套的移动办公APP&#xff0c;支持IOS和安卓端&#xff0c;用户可在连接O2云之后&#xff0c;使用APP使用移动办公。移动办公APP开放源代码&#xff0c;不会产生任何费用。本篇主要简单讲述初如何完成服务器连接O2云&#xff0c;实现移动办公。 一、先决…

Barnes-Hut t-SNE:大规模数据的高效降维算法

在数据科学和分析中&#xff0c;理解高维数据集中的底层模式是至关重要的。t-SNE已成为高维数据可视化的有力工具。它通过将数据投射到一个较低维度的空间&#xff0c;提供了对数据结构的详细洞察。但是随着数据集的增长&#xff0c;标准的t-SNE算法在计算有些困难&#xff0c;…

什么是IoT?

什么是IoT&#xff1f; IoT&#xff0c;即物联网&#xff08;Internet of Things&#xff09;&#xff0c;是通过信息传感设备和互联网将各种物品连接起来&#xff0c;实现智能化的识别、定位、跟踪、监控和管理的网络系统。 以下是关于IOT的一些详细解释&#xff1a; 基本概…

JVM之本地方法栈和程序计数器和堆

本地方法栈 本地方法栈是为虚拟机执行本地方法时提供服务的 JNI&#xff1a;Java Native Interface&#xff0c;通过使用 Java 本地接口程序&#xff0c;可以确保代码在不同的平台上方便移植 不需要进行 GC&#xff0c;与虚拟机栈类似&#xff0c;也是线程私有的&#xff0c;…

OCP Java17 SE Developers 复习题13

答案 D, F. There is no such class within the Java API called ParallelStream, so options A and E are incorrect. The method defined in the Stream class to create a parallel stream from an existing stream is parallel(); therefore, option F is correct, and o…

高斯溅射融合之路(一)- webgl渲染3d gaussian splatting

大家好&#xff0c;我是山海鲸的技术负责人。之前已经写了一个GIS融合系列。其实CesiumJS的整合有相当的难度&#xff0c;同时也有很多方面的工作&#xff0c;很难在几篇文章内写完&#xff0c;整个山海鲸团队也是投入了接近两年的时间&#xff0c;才把周边整套工具链进行了完善…

Linux中inode号与日志分析

一.inode号 1.inode表结构 元信息&#xff1a;每个文件的属性信息&#xff0c;比如&#xff1a;文件的大小&#xff0c;时间&#xff0c;类型&#xff0c;权限等&#xff0c;称为文件的元数据(meta data 元信息 ) 元数据是存放在inode&#xff08;index node&#xff09;表中…

Spring Kafka—— KafkaListenerEndpointRegistry 隐式注册分析

由于我想在项目中实现基于 Spring kafka 动态连接 Kafka 服务&#xff0c;指定监听 Topic 并控制消费程序的启动和停止这样一个功能&#xff0c;所以就大概的了解了一下 Spring Kafka 的几个重要的类的概念&#xff0c;内容如下&#xff1a; ConsumerFactory 作用&#xff1a;…

Opencv_2_ 图像色彩空间转换

ColorInvert.h 内容如下&#xff1a; #pragma once #include <opencv.hpp> using namespace std; #include <opencv.hpp> using namespace cv; using namespace std; class ColorInvert{ public : void colorSpaceInvert(Mat&image); }; ColorInvert.cpp…

高效过滤器检漏方法选择指南及关键注意事项一览

在生物制药企业中&#xff0c;高效过滤器&#xff08;HEPA&#xff09;的检漏工作是确保洁净室能够达到并保持设计的洁净级别的关键步骤。这关系到产品的质量和安全&#xff0c;因此必须遵循相关法规标准和操作流程。 关于北京中邦兴业 北京中邦兴业科技有限公司是一家国家高新…

element中file-upload组件的提示‘按delete键可删除’,怎么去掉?

问题描述 element中file-upload组件会出现这种提示‘按delete键可删除’ 解决方案&#xff1a; 这是因为使用file-upload组件时自带的提示会盖住上传的文件名&#xff0c;修改一下自带的样式即可 ::v-deep .el-upload-list__item.is-success.focusing .el-icon-close-tip {d…

基于SpringBoot的宠物领养网站管理系统

基于SpringBootVue的宠物领养网站管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 宠物领养 宠物救助站 宠物论坛 登录界面 管理员界面 摘要 基于Spr…

1.C++入门

目录 1.C关键字 2.命名空间 作用域方面的优化 a.命名空间定义 b.命名空间使用 3.C 输入&输出 1.C关键字 C有63个关键字&#xff0c;C语言有32个关键字&#xff0c;存在重叠如荧光笔标出 2.命名空间 作用域方面的优化 如果变量&#xff0c;函数和类的名称都存在于全…

AI自动生成PPT文档 aippt的API介绍文档

官方链接直达&#xff01; 产品介绍​ 能力介绍​ AiPPT 是一款智能生成演示幻灯片的在线工具。专业设计团队打造海量模板资源&#xff0c;输入标题即可轻松生成完整的PPT。同时 AiPPT 支持导入多格式文档一键生成 PPT&#xff0c;让 PPT 创作更加高效。聚焦于内容&#xff0…

安装zabbix server

目录 1、实验环境 2、yum 安装zabbix server 2.1 解决权限问题和放行流量 2.2 安装zabbix-server 1、实验环境 操作系统rhel8zabbix6.0TLS数据库mysql8.0.30IP地址192.168.81.131时间配置NTP时间服务器同步 2、yum 安装zabbix server 如果通过yum源安装&#xff0c;操作系…

SysetmUI开机是否显示Keyguard的流程

KeyguardViewMediator的onSystemReady方法 没有启用keyguard时KeyguardViewMediator的log&#xff1a; onSystemReady 方法 doKeyguardLocked LockPatternUtils.isLockScreenDisabled 来判断是否启用 public final static String DISABLE_LOCKSCREEN_KEY "lockscreen.…

信息化工作人员必备常识4——ping命令详解【不间断发包自定义发包的大小自定义发包次数】

信息化工作人员必备常识4——ping命令详解【不间断发包&自定义发包的大小&自定义发包次数】 前言回顾pingtelnetnslookup命令 ping 命令详解帮助手册不间断向目标 IP 发送数据包 -t定义发送数据包的大小 -l-t&-l 验证网络承载能力自定义发送数据包的次数统计响应时…

[BT]BUUCTF刷题第20天(4.22)

第20天 Web [GWCTF 2019]我有一个数据库 打开网站发现乱码信息&#xff08;查看其他题解发现显示的是&#xff1a;我有一个数据库&#xff0c;但里面什么也没有~ 不信你找&#xff09; 但也不是明显信息&#xff0c;通过dirsearch扫描得到robots.txt&#xff0c;然后在里面得…

51单片机数字温度报警器_DS18B20可调上下限(仿真+程序+原理图)

数字温度报警器 1 **主要功能&#xff1a;*****\*资料下载链接&#xff08;可点击&#xff09;&#xff1a;\**** 2 **仿真图&#xff1a;**3 **原理图&#xff1a;**4 **设计报告&#xff1a;**5 **程序设计&#xff1a;**主函数外部中断函数DS18B20驱动 6 讲解视频7 **资料清…