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://xiahunao.cn/news/2982155.html

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

相关文章

Go Sync并发包之errgroup

你是否写过一个函数&#xff0c;它之所以很长&#xff0c;是因为它要完成很多任务&#xff0c;即使这些任务之间并不相互依赖&#xff1f; 你是否写过一个很长的函数&#xff0c;因为它要完成很多任务&#xff0c;即使这些任务并不相互依赖&#xff1f;我就遇到过这种情况。 想…

BRC铭文NFT铸造质押挖矿系统开发运营

区块链技术的不断演进与应用拓展&#xff0c;为数字资产领域带来了更多可能性。BRC铭文NFT铸造质押挖矿系统的开发与运营&#xff0c;将为用户提供一种全新的数字资产体验&#xff0c;下文将介绍其版/需求方案/逻辑项目。 1. 系统概述 BRC铭文NFT铸造质押挖矿系统旨在结合区块…

数据库之数据库恢复技术思维导图+大纲笔记

大纲笔记&#xff1a; 事务的基本概念 事务 定义 用户定义的一个数据库操作系列&#xff0c;这些操作要么全做&#xff0c;要么全不做&#xff0c;是一个不可分割的基本单位 语句 BEGIN TRANSACTION 开始 COMMIT 提交&#xff0c;提交事务的所有操作 ROLLBACK 回滚&#xff0c…

电商技术揭秘三十一:智能风控与反欺诈技术

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘二十八&#xff1a;安全与合规性保障 电商技术揭秘二十九&#xff1a;电商法律合规浅析 电商技术揭秘三十&#xff1a;知识产权保…

科林Linux_3 进程

一、进程基础 操作系统基础的执行单元&#xff0c;调度单位 静态数据&#xff1a;只占用磁盘空间&#xff0c;不消耗其他资源 动态数据&#xff1a;磁盘 内存 CPU 1. 编译器将源码编译成一个可执行文件.exe/.elf 2. 运行后系统生成一个同名的进程 程序是进程的静态表现&a…

网络变压器的磁芯在使用中起着至关重要的作用

网络变压器的磁芯在使用中起着至关重要的作用。它主要有以下几个功能&#xff1a; 1. **提供磁通路径**&#xff1a;磁芯为变压器中电磁感应提供了闭合的磁通路径。这有助于提高变压器的效率&#xff0c;因为它确保了磁场能够有效地通过绕组。 2. **减少能量损失**&#xff1…

开发环境中的调试视图(IDEA)

当程序员写完一个代码时必然要运行这个代码&#xff0c;但是一个没有异常的代码却未必满足我们的要求&#xff0c;因此就要求程序员对已经写好的代码进行调试操作。在之前&#xff0c;如果我们要看某一个程序是否满足我们的需求&#xff0c;一般情况下会对程序运行的结果进行打…

Spring框架九大核心功能全面揭秘(一)

目录 资源管理 Java资源管理 1、来个Demo 2、原理 Spring资源管理 1、资源抽象 Resource WritableResource 2、资源加载 3、小结 环境 1、Environment 2、配置属性源PropertySource 3、SpringBoot是如何解析配置文件 类型转换 1、类型转换API …

Ubuntu+Systemd服务+实现开机自启

1.创建一个新的 systemd 服务文件 现在随便一个地方创建txt文档 如果想要启动sh脚本&#xff0c;就把下面的代码输入到txt文档中 [Unit] DescriptionRun Python script on specific executable run Afternetwork.target[Service] Typesimple ExecStart/home/tech/run_on_exe…

光接入网络的超宽带半导体光放大器

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 新颖的双有源层结构获得宽增益光谱&#xff0c;应用于多波单纤双向光放大 ----翻译Xiao Sun等人2016年撰写的文章&#xff0c;文中给出了宽光谱SOA的一种新颖的结构设计方法和仿真结果&#xff0c;但并未给…

社交媒体数据恢复:Instagram

Instagram数据恢复方法 在本文中&#xff0c;我们将详细介绍如何恢复在Instagram上删除的照片、消息和其他数据。请注意&#xff0c;这些方法可能适用于其他类型的社交媒体数据&#xff0c;但具体效果取决于数据的实际状态和存储设备的健康状况。 一、准备工作 在开始数据恢…

四川赢涟电子商务有限公司深耕抖音电商服务

在当今数字化、网络化高速发展的时代&#xff0c;电子商务行业异军突起&#xff0c;成为推动经济增长的重要力量。四川赢涟电子商务有限公司凭借其敏锐的市场洞察力和创新精神&#xff0c;专注于抖音电商服务&#xff0c;致力于为广大消费者提供便捷、高效、个性化的购物体验&a…

kafka启动报错(kafka.common.InconsistentClusterIdException)

文章目录 前言kafka启动报错(kafka.common.InconsistentClusterIdException)1. 查找日志2. 定位问题/解决 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不…

基于YOLOv8+Pyqt5火焰烟雾检测系统

1、YOLOv8的基本原理 YOLOv8是一种前沿的目标检测技术&#xff0c;它基于先前YOLO版本在目标检测任务上的成功&#xff0c;进一步提升了性能和灵活性。主要的创新点包括一个新的骨干网络、一个新的 Ancher-Free 检测头和一个新的损失函数&#xff0c;可以在从 CPU 到 GPU 的各…

Golang | Leetcode Golang题解之第47题全排列II

题目&#xff1a; 题解&#xff1a; func permuteUnique(nums []int) (ans [][]int) {sort.Ints(nums)n : len(nums)perm : []int{}vis : make([]bool, n)var backtrack func(int)backtrack func(idx int) {if idx n {ans append(ans, append([]int(nil), perm...))return}…

数据分析学习资源(未完)

1、PDF 数据分析自学攻略 增长黑客&#xff08;AARRR&#xff09; 量化思维

glib读写ini文件测试

函数简介 g_key_file_load_from_file g_key_file_load_from_file() 是 GLib 库中的一个函数&#xff0c;用于从指定的文件路径加载一个键值对文件&#xff08;通常是一个 .ini 风格的配置文件&#xff09;。这个函数是 GKeyFile 结构体相关API的一部分&#xff0c;GKeyFile 用…

C++面向对象程序设计 - 重载运算符进一步讨论

函数重载就是对一个已有的函数赋予新的含义&#xff0c;使之实现新的功能。因此一个函数名就可以用来代表不同功能的函数&#xff0c;也就是一名多用。运算符也可以重载&#xff0c;即运算符重载&#xff08;operator overloading&#xff09;。 一、非成员、非友元的重载运算…

STM32F103学习笔记 | 1.Keil5详细安装教程

Keil5详细安装教程 https://www.keil.com/download/product/

使用API有效率地管理Dynadot域名,自查账户信息

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…