TypeScript 中接口的理解?应用场景?
一、是什么
「接口」是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的「类」去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法
简单来讲,一个接口所描述的是一个对象相关的属性和方法,但并不提供具体创建此对象实例的方法
typescript
的核心功能之一就是对类型做检测,虽然这种检测方式是“鸭式辨型法”,而接口的作用就是为为这些类型命名和为你的代码或第三方代码定义一个约定
二、使用方式
接口定义如下:
interface interface_name { }
例如有一个函数,这个函数接受一个 User
对象,然后返回这个 User
对象的 name
属性:
const getUserName = (user) => user.name
可以看到,参数需要有一个user
的name
属性,可以通过接口描述user
参数的结构
interface User { name: string age: number } const getUserName = (user: User) => user.name
这些属性并不一定全部实现,上述传入的对象必须拥有name
和age
属性,否则typescript
在编译阶段会报错,如下图:
如果不想要age
属性的话,这时候可以采用「可选属性」,如下表示:
interface User { name: string age?: number }
这时候age
属性则可以是number
类型或者undefined
类型
有些时候,我们想要一个属性变成只读属性,在typescript
只需要使用readonly
声明,如下:
interface User { name: string age?: number readonly isMale: boolean }
当我们修改属性的时候,就会出现警告,如下所示:
这是属性中有一个函数,可以如下表示:
interface User { name: string age?: number readonly isMale: boolean say: (words: string) => string }
如果传递的对象不仅仅是上述的属性,这时候可以使用:
- 类型推断
interface User { name: string age: number } const getUserName = (user: User) => user.name getUserName({color: 'yellow'} as User)
- 给接口添加字符串「索引签名」
interface User { name: string age: number [propName: string]: any; }
接口还能实现继承,如下图:
也可以继承多个,父类通过逗号隔开,如下:
interface Father { color: String } interface Mother { height: Number } interface Son extends Father,Mother{ name: string age: Number }
三、应用场景
例如在javascript
中定义一个函数,用来获取用户的姓名和年龄:
const getUserInfo = function(user) { // ... return name: ${user.name}, age: ${user.age} }
如果多人开发的都需要用到这个函数的时候,如果没有注释,则可能出现各种运行时的错误,这时候就可以使用接口定义参数变量:
// 先定义一个接口 interface IUser { name: string; age: number; } const getUserInfo = (user: IUser): string => { return `name: ${user.name}, age: ${user.age}`; }; // 正确的调用 getUserInfo({name: "koala", age: 18});
包括后面讲到类的时候也会应用到接口
参考文献
- https://www.tslang.cn/docs/handbook/interfaces.html
本文来自博客园,作者:喆星高照,转载请注明原文链接:https://www.cnblogs.com/houxianzhou/p/15222088.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-09-03 vue 使用 sass 或者 less ( vue-cli 3 )