5. TypeScript 接口

2023-11-20

TypeScript 接口

接口可以在面向对象编程中表示行为的抽象,也可以描述对象的形状。 接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。 (接口中不能含有具体的实现逻辑)

1. 函数接口参数

// 没有接口的写法
const fullName = ({firstName,lastName}: {firstName:string,lastName:string}): string => {
  return firstName + lastName
}
// 接口写法:使用接口约束函数中的参数,但是类型无法复用
interface IFullName {
  firstName: string,
  lastName: string
}
const fullName2 = ({firstName,lastName}: IFullName): string => { // : string 函数返回类型需要手写
  return firstName + lastName
}

2. 函数类型接口

interface IFullName3 {
  firstName: string,
  lastName: string
}
interface IFn { // 通过接口限制函数的参数类型和返回值类型
  (obj:IFullName3):string // 函数参数:函数返回类型
}
const fullName3:IFn = ({firstName,lastName}) => {
  return firstName + lastName
}
console.log("2. 函数类型接口", fullName3);

3. 函数混合类型

interface ICounter {
  (): number;   // 限制函数返回类型
  count: 0      // 限制函数上的属性
}
let fn: any = () => {
  fn.count++;
  return fn.count;
}
fn.count = 0;
let counter:ICounter = fn;
console.log("3. 函数混合类型", counter());

4. 对象接口

// 对象接口可以用来描述对象的形状结构
interface IVegetables {
  readonly color: string, // readOnly 标识的属性则不能修改
  size: string
}
interface IVegetables { // 多个同名的接口会自动合并
  age?: number, // ?: 标识的属性为可选属性
  taste: 'sour' | 'sweet'
}
const tomato: IVegetables = {
  color:'red',
  size:'10',
  taste:'sour'
}
// tomato.color = 'green'; // Cannot assign to 'color' because it is a read-only  仅读属性不能进行修改
console.log("4. 对象接口 tomato", tomato);

// 多个同名的接口会自动合并
const tomato2: IVegetables = {
  color:'red',
  size:'10',
  taste:'sour',
  type:'蔬菜'     // error: 不可分配给类型“IVegetables”。对象字面量只能指定已知属性,并且类型“IVegetables”中不存在“type”。
} as IVegetables; // 多余的属性可以使用类型断言 就不会报以上错误
console.log("4. 对象接口 tomato2", tomato2);

5. 任意属性、可索引接口

interface Person {
  name: string;
  [key: string]: any
}
let p: Person = {
  name: '123',
  age: 10,
  [Symbol()]: '321'
}
console.log("5. 任意属性、可索引接口", p);
// 任意属性可以对某一部分必填属性做限制,其余的可以随意增减
interface IArr {
  [key: number]: any
}
let p2: IArr = {
  0:'1',1:'2',3:'3'
}
let arr:IArr = [1,'d','c']; 
// 可索引接口可以用于标识数组
console.log("5. 任意属性、可索引接口", p2, arr);

6. 类接口

// 这里先来强调一下抽象类和接口的区别,抽象类中可以包含具体方法实现。接口中不能包含实现
interface Speakable {
  name:string;
  speak():void; // 接口中不能包含实现
}
interface ChineseSpeakable{
  speakChinese():void
}
// 抽象类中可以包含具体方法实现
class Speak implements Speakable, ChineseSpeakable { //  implements 实现 Speakable, ChineseSpeakable 接口
  name!:string
  speak(){}
  speakChinese(){}
}
// 个类可以实现多个接口,在类中必须实现接口中的方法和属性
console.log("6. 类接口", new Speak);

7. 接口继承

interface Speakable2 {
  speak():void
}
interface SpeakChinese extends Speakable2 {
  speakChinese():void
}
class Speak2 implements SpeakChinese {
  speakChinese(): void {
      throw new Error("Method not implemented.");
  }
  speak(): void {
      throw new Error("Method not implemented.");
  }
}
console.log("7. 接口继承", new Speak2())

8. 构造函数类型

interface Clazz {
  new (name:string):any
}
function createClass(target:Clazz,name:string){
  return new target(name); // 传入的是一个构造函数
}
class Animal {
  constructor(public name:string){
      this.name = name;
  }
}
let r = createClass(Animal,'Tom'); // let r: any 这里无法标识返回值类型

// 标识返回值类型写法如下: (通过泛型实现)
interface Clazz2<T> {
  new(name: string): T
}
function createClass2<T>(target: Clazz2<T>, name: string):T {
  return new target(name)
}
class Animal2 {
  constructor(public name: string) {
      this.name = name;
  }
}
let r2 = createClass2(Animal2, 'Tom'); // let r2: Animal2
// new() 表示当前是一个构造函数类型,这里捎带使用了下泛型。 在使用 createClass 时动态传入类型
console.log('8. 构造函数类型', r, r2)
GitHub Gitee
https://github.com/shunyue1320/TypeScript-learn https://gitee.com/shunyue/TypeScript-learn
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

5. TypeScript 接口 的相关文章

  • 如何理解 Angular JS 中的控制台错误消息?有什么工具吗?

    我是 Angular JS 的新手 我的第一个问题是如何理解 Angular JS 中控制台的错误消息 我编写了这段用于匹配密码的代码片段 它在控制台上抛出错误 但它工作正常 它是有线的 我无法从这些控制台消息中理解任何内容 谁能指出我为什
  • Twisted 的 Deferred 和 JavaScript 中的 Promise 一样吗?

    我开始在一个需要异步编程的项目中使用 Twisted 并且文档非常好 所以我的问题是 Twisted 中的 Deferred 与 Javascript 中的 Promise 相同吗 如果不是 有什么区别 你的问题的答案是Yes and No
  • 限制文本区域中每行的字符数

    我整个周末都在寻找解决这个难题的方法 但尚未找到一个可以正常工作的解决方案 我想要实现的是限制文本区域中每行的字符数 不是相同地限制它们 而是我选择的每行不同的字符数 例如 我只想在我的文本区域中包含 4 行 第 1 2 和 3 行将限制为
  • 在 BIRT 中输入参数后更新数据集查询

    在 BIRT 报告设计中传递参数后 如何更改或更新数据集的查询 详细说明 我有一个如下所示的查询 WHERE 该参数标记可以保存不同的值 在用户输入参数后 它看起来像这样 例如 WHERE column name 1 or WHERE co
  • 将 jquery-mobile 与 Webpack 结合使用

    我正在尝试使用 webpack 加载 jquery mobile 但到目前为止还没有运气 我知道 jquery mobile 依赖于 jquery ui 而 jquery ui 又依赖于 jquery 如何在 Webpack 中设置这样的场
  • 将 Sweet Alert 弹出窗口添加到 React 组件中的按钮

    我为 Bootstrap 和 React 找到了这个完美的 Sweet Alert 模块 我在 Meteor 应用程序中使用它 http djorg83 github io react bootstrap sweetalert http d
  • 将音频与视频流合并 Node.js

    我正在创建 YouTube 视频下载器并且正在使用ytdl core库 它无法下载带有音频的高质量视频 因为 youtube 将其放在另一个文件中 但我需要将其全部下载到一个文件中 我已经这样做了 app get download asyn
  • 使react-leaflet能够离线使用

    我一直在使用反应传单 https github com PaulLeCam react leaflet图书馆 到目前为止运作良好 现在我希望网站预加载尽可能多的图块 以便网络应用程序 也是 PWA 可以在没有互联网的情况下使用 我找到了一些
  • 用数组反向查找对象

    假设我有一个这样的对象 resourceMap a 0 1 2 3 4 5 6 7 8 9 10 b 11 12 c 21 23 d 54 55 56 57 510 确定是否的最佳方法是什么resourceId 21将会 c 我们不知道钥匙
  • 访问 TypeScript 数组的最后一个元素

    TypeScript 中有访问数组最后一个元素的符号吗 在 Ruby 中我可以说 array 1 有类似的东西吗 您可以通过索引访问数组元素 数组中最后一个元素的索引将是数组的长度 1 因为索引是从零开始的 这应该有效 var items
  • 如何从顺序键盘导航中删除 Vuetify 附加图标

    在带有 Vuetify 的 Vue js 应用程序中 我有一组用v text field并且其中有一个append icon为了切换文本可见性 如下所示
  • 如何访问另一个 mobx 商店中的 mobx 商店?

    假设以下结构 stores RouterStore js UserStore js index js each of Store jsfiles 是一个 mobx 存储类 包含 observable and action index js只
  • 如何在 e2e AngularJS 测试中进行文件上传?

    在我的一种观点中 我有一个文件上传控件 它支持通过拖放或单击按钮后打开的标准文件对话框上传文件 How to do this in my e2e tests1 1 Just one of the two options will be en
  • 装饰器可以更改方法的签名吗?

    考虑一个函数 function handleFoo foo number 我想要一个解析 foo 的装饰器 例如 fetchFromApi foo function handleFoo foo number where fetchFromA
  • 需要js、d3 和 nvd3 集成

    我面临整合的问题要求 questions tagged requirejs with d3 questions tagged d3 and nvd3 questions tagged nvd3 我找到了一个使用 require 的简单解决方
  • 当选择下拉列表中的某些值时,取消选中复选框

    当我从下拉列表中选择某个值或用户未从下拉列表中选择任何值时 我需要取消选中复选框 我现在正在使用 Jquery 这是我现在使用的代码 但它不起作用 Script
  • Typescript:类类型的实例

    我的课程类型如下A Type class A constructor public a string type A Type new a string A 我想获取实例的类型A Type构造函数 以便我可以显式键入该函数 class A c
  • Restangular - _.contains() 不是一个函数

    如果您最近通过 Bower 更新了 Restangular 它将安装最新的 Lodash 新的 4 0 然而 这是一个问题 因为 Restangular Angular 现在会抛出错误 contains 不是函数 你怎么解决 解决方案非常简
  • 我可以使用 jQuery 动态创建文件(及其内容)吗? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 这是我的 HTML 代码 ul li
  • 如何更改订阅值?使用 rxJS

    我正在创建一个计时器 需要你的帮助 我刚刚学习 Angular 和 rxJS 对此我有一些疑问 我正在创建一个具有启动 停止 暂停 重置功能的计时器 并且 btn Reset 必须将我的计时器 暂停 到 300 毫秒 怎么做 D 我的启动定

随机推荐

  • Android Log系统介绍 (基于Android N)

    原文使用有道云笔记创作 看这个 http note youdao com noteshare id 82f88b1c82652b80c27d54aad55af035 引言 gt Android 的log 从操作系统分层上来讲 可以分为 Ke
  • Linux内核驱动之GPIO子系统(一)GPIO的使用

    分类 Linux内核驱动 2012 10 31 21 12 162人阅读 评论 1 收藏 举报 目录 一 概述 Linux内核中gpio是最简单 最常用的资源 和 interrupt dma timer一样 驱动程序 应用程序都能够通过相应
  • Subwords Tokenizer方法介绍: BPE, Byte-level BPE, WordPiece, Unigram, SentencePiece

    参考于transformers tokenizer的文档 目录 Byte Pair Encoding BPE 1 出发点 原理 应用 Byte level BPE 2 出发点 原理 应用 WordPiece 3 原理 应用 Unigram
  • 一种踩内存的定位方法(C++)

    在嵌入式应用开发过程中 踩内存的问题常常让人束手无策 使用gdb调试工具 可以大幅加快问题的定位 不过 对于某些踩内存的问题 它的表现是间接的 应用崩溃的位置也是不固定的 这就给问题定位带来了更大的困难 笔者见过带有虚函数C 的类对象在试图
  • 2021春招已正式开启,阿里巴巴企业智能事业部内推,有意者看下文!

    前言 说一说已经拿到内推的两个朋友的面试经验 你们可以看一下准备一下 同事A阿里巴巴一面 55分钟 先介绍一下自己吧 说一下自己的优缺点 具体讲一下之前做过的项目 你觉得项目里给里最大的挑战是什么 Hashmap为什么不用平衡树 AQS知道
  • 程序员要不断学习

    2016 10 20 计算机技术的发展速度还是很快的 当个人电脑赶上10年前的超算时 我们不得不感叹硬件的发展编程开发带来了很大的影响 对世界带来了很大的影响 知识和工具的更新速度还是比较快的 这就要求程序员始终需要学习 我在知乎上看到一个
  • redis 配置与优化

    目录 一 关系数据库和非关系型数据库 二 关系型数据库和非关系型数据库区别 三 非关系型数据库产生背景 四 redis 1 概念 2 redis的优点 3 redis为什么这么快 五 redis安装与配置 一 关系数据库和非关系型数据库 关
  • Scrapy爬取图片自定义图片文件名时出现的问题

    目录 出现的问题 只下载了一张图片 图片的名称为最后一张图片的名称 但内容并不是最后一张图片的内容 在打印时 最后一张图片的相关信息出现多次 对应文件的相关信息 Items文件相关内容 Spider文件内容 Settings文件内容 Pip
  • 静态类(static class)、成员类(member class)、局部类(local class)、匿名类   (anonymous class)

    内部类定义 在一个类的内部定义一个类 内部类分为 静态类 static class 成员类 member class 局部类 local class 匿名类 anonymous class static class 作为类的静态成员存在于某
  • DDD专家张逸:构建领域驱动设计知识体系

    张逸 读完需要 5分钟 速读仅需 2 分钟 领域驱动设计专家 曾就职于 ThoughtWorks 作为 Lead Consultant 为客户提供架构设计 大数据分析 持续交付 代码质量 敏捷管理等咨询服务 著译作包括 软件设计精要与模式
  • 线性模型和非线性模型的区别,以及激活函数的作用

    线性模型和非线性模型的区别 以及激活函数的作用 线性模型和非线性模型的区别 a 线性模型可以用曲线拟合样本 线性模型可以是用曲线拟合样本 但是分类的决策边界一定是直线的 例如logistics模型 广义线性模型 将线性函数进行了一次映射 b
  • 华为OD机试(JAVA)真题 -- 数据分类

    对一个数据a进行分类 分类方法为 此数据a 四个字节大小 的四个字节相加对一个给定的值b取模 如果得到的结果小于一个给定的值c 则数据a为有效类型 其类型为取模的值 如果得到的结果大于或者等于c 则数据a为无效类型 比如一个数据a 0x01
  • 从《数学之美》中我想到的

    吴军老师作为NLP领域的专家 在 数学之美 中把各种高大上的技术介绍得如此通俗易懂 抛去了冗杂的公式 呈现出最原始的数学思想 能够把复杂的问题用最简单易懂的语言表达出来 看来吴军老师的数学功底 工程实践水平非同一般 在 数学之美 里面 谈到
  • 立创EDA(专业版)画PCB怎么开窗?

    阻焊层是开窗 助焊层是开钢网用的 大概的步骤 1 选择图层 顶层阻焊层 如果是想在顶层开窗 2 画个矩形框框 3 右击点击属性 选择顶层阻焊 4 利用3D PCB 观察 如果选择区域和有类似焊盘上的没有覆膜的管脚的那个黄铜的部分 成功了
  • 跨域与跨域访问

    什么是跨域 跨域是指从一个域名的网页去请求另一个域名的资源 比如从www baidu com 页面去请求 www google com 的资源 跨域的严格一点的定义是 只要 协议 域名 端口有任何一个的不同 就被当作是跨域 为什么浏览器要限
  • 两种接入微信小程序智能客服对话的方式

    微信小程序 此处提供两种接入微信小程序的方式 方式一 扫码将机器人绑定至指定小程序 通过小程序内的客服组件开启智能对话功能 方式二 通过小程序插件接入 方式一 后台扫码绑定 流程示意 效果展示 使用页面 小程序页面中 点击 客服按钮 官方组
  • QT 打印/输出 的 3种方法

    1 cout输出 include
  • 【复变函数】常用公式大全

    文章目录 基本公式 几个高斯的公式 其实都是留数法 留数法 一些公式 一些积分 欢迎纠错 基本公式 f z u
  • 华为5500v3多路径linux6,CentOS7 DM-Multipath+HUAWEI OceanStor存储多路径配置

    在参看了网上他人的配置 结合RedHat的技术白皮书实现后 自己亲身在CentOS7 HUAWEI OceanStore S2600T的基础上配置了一个DM Multipath存储多路径的实现 其中碰到了一些小问题和不明白的地方 书上感觉也
  • 5. TypeScript 接口

    TypeScript 接口 接口可以在面向对象编程中表示行为的抽象 也可以描述对象的形状 接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约 接口中不能含有具体的实现逻辑 1 函数接口参数 没有接口的写法 const fullNa