您现在的位置是:首页 > 正文

关于typeScript中接口的一些理解

2024-02-29 11:42:11阅读 0


前言

在最近学习TypeScript中接口相关知识的过程中,遇到了一个让我十分困惑的地方。就是 接口继承类 这部分。文档上给的例子和他的解释看起来并无关系,在网上又找了好多,大部分都是照搬源文档,cv工程师,属实给我整不会了。在此记录下当前自己的理解吧。


一、文档说明示例及疑问点

当接口继承了一个类类型时,它会继承类的成员但不包括其实现。 就好像接口声明了所有类中存在的成员,但并没有提供具体实现一样。 接口同样会继承到类的private和protected成员。 这意味着当你创建了一个接口继承了一个拥有私有或受保护的成员的类时,这个接口类型只能被这个类或其子类所实现(implement)。

当你有一个庞大的继承结构时这很有用,但要指出的是你的代码只在子类拥有特定属性时起作用。 这个子类除了继承至基类外与基类没有任何关系。 例:

class Control {
   private state: any;
}

interface SelectableControl extends Control {
   select(): void;
}

class Button extends Control implements SelectableControl {
   select() { }
}

class TextBox extends Control {
   select() { }
}

// 错误:“Image”类型缺少“state”属性。
class Image implements SelectableControl {
   select() { }
}

class Location {

}

在上面的例子里,SelectableControl包含了Control的所有成员,包括私有成员state。 因为 state是私有成员,所以只能够是Control的子类们才能实现SelectableControl接口。 因为只有 Control的子类才能够拥有一个声明于Control的私有成员state,这对私有成员的兼容性是必需的。

在Control类内部,是允许通过SelectableControl的实例来访问私有成员state的。 实际上, SelectableControl接口和拥有select方法的Control类是一样的。 Button和TextBox类是SelectableControl的子类(因为它们都继承自Control并有select方法),但Image和Location类并不是这样的。

疑问点:在Control类内部,是允许通过SelectableControl的实例来访问私有成员state的。

首先,什么叫做接口的实例,按照我个人的理解以及身边后端人员的分析,所谓的接口的实例,就是指通过new运算符生成的实现了该接口的实例对象。在上述代码中,等于是new Button();

证明:要证明上述理解正确,只需要在Control类内部通过该实例访问其state属性即可

class Control {
  private state: any = "Control"; // 先写死,有助于判断
  fn() {
    console.log(new Button2().state);
  }
}

interface SelectableControl extends Control {
  select(): void;
}

class Button extends Control implements SelectableControl {
  select() { }
}

new Control().fn() // Control

不确定的地方

如下所示,通过继承Control得到的Button2也可以直接访问到Control。并没有实现SelectableControl接口。

class Control {
  private state: any = "Control"; // 先写死,有助于判断
  fn() {
    console.log(new Button2().state);
  }
}

interface SelectableControl extends Control {
  select(): void;
}

class Button2 extends Control {
}

new Control().fn() // Control

目前的理解

接口在Ts中仅仅作为一种检验的规范,就如同文档上说的那样,只注重与外形。所以实现某个接口,和直接将方法写在类中效果是类似的。上面的代码通过extends关键字继承得到了父类的私有属性state,本质上和Button并无差异。区别仅在于Button实现了SelectableControl接口,满足规范。

如果有不正确的地方,还请指出,因为网上相关的解释比较少,而接口继承类在java中也没有类似的,所以可能缺乏正确的理解。

网站文章

  • 转自牛客竞赛网

    链接:https://ac.nowcoder.com/discuss/86963?type=101&order=0&pos=1&page=1来源:牛客网1、Wannafly挑战赛题解汇总 https://www.nowcoder.com/discuss/875092、牛客练习赛题解汇总https://www.nowcoder.com/discuss/87537...

    2024-02-29 11:41:41
  • java try 没有catch_Java Try Catch Finally块没有Catch

    我在复习一些新的代码。该程序只有一个try和finally块。由于catch块被排除在外,如果遇到异常或任何可丢弃的情况,try块如何工作?它是直接去最后一个街区吗?Try Finally和Try C...

    2024-02-29 11:41:33
  • 初识jsp

    初识jsp本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦: 什么是jsp CS和BS的区别 TOMCAT 在MyElipse中配置TOMCAT JSP的基础语法 - dao层的概念和拓展什么是jspJSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它[1] 是由Sun Microsy

    2024-02-29 11:41:27
  • CSV(Comma-Separate-Values)逗号分隔值文件

    CSV(Comma-Separate-Values)逗号分隔值文件

    前言 一、CSV文件背景 二、CSV文件用法 三、CSV文件规则 四、CSV文件包含的各种数据 1.常规的内容 2.字段内部有逗号 3.字段内部有引号 4.字段内部有换行符 5.字段内部有空格 五、CSV文件规则

    2024-02-29 11:41:00
  • 推荐 Word、EXCEL必备工具箱

    EXCEL必备工具箱: EXCEL必备工具箱是一个同时支持EXCEL/WPS插件,自带免费多标签(类似于OfficeTab),安装后就可以使用,与excel/wps完全溶为一体,绝大部分操作执行后可撤销。完美支持32位/64位OFFICE,以及2014年11月抢先版及更高版本的WPS! EXCEL必备工具箱智能识别当前是32/64位的EXCEL还是WPS,自动屏蔽WPS已有功能,额外增...

    2024-02-29 11:40:53
  • 别人的MIPI自学笔记

    别人的MIPI自学笔记

    转自知乎:https://zhuanlan.zhihu.com/p/92682047 前言 经常听到MIPI这个接口,并且在实际的摄像头项目中也用到了,但是每次去网上搜关于MIPI的资料的时候总是觉得...

    2024-02-29 11:40:47
  • spring boot redis序列化key-value乱码问题

    spring boot redis序列化key-value乱码问题

    问题现象最近使用spring-data-redis RedisTemplate 操作redis时发现存储在redis中的key不是设置的string值,像test:1这样的key乱码了。用Anothe...

    2024-02-29 11:40:19
  • Android 判断控件是否在屏幕中可见 ScrollView

    首先进行简单的分析: 判断ScrollView某个控件是否在屏幕中可见,这里有两种可能,第一种该控件直接就是在屏幕中可见,另外一种需要滑动到一定位置方可见 下面一一给出具体的实现代码 1、自定义ScrollViewpublic class MyScrollView extends ScrollView { public OnScrollChangeListener onScrollCh

    2024-02-29 11:40:12
  • JMeter三种参数化方式

    JMeter三种参数化方式

    jmeter在进行测试的时候,每次迭代的数据不一样的时候,需要进行参数化,从参数化的文件中来读取测试数据,那么,jmeter如何参数化呢?下面给大家介绍五种JMeter参数化的方式:一.使用用户定义的变量User Defined Variables1)添加User Defined Variables模块2)配置User Defined Variables界面中的参数及其值...

    2024-02-29 11:40:04
  • SpringBoot自动装配、启动流程及自定义starter

    SpringBoot自动装配、启动流程及自定义starter

    作为一名程序员,框架是我们平常工作中非常重要的一个框架。其为我们提供了容器和的功能,在很大程度上简化了我们项目中的开发,但随着我们使用接入的组件的增加,相应的配置文件也越来越多,这些配置文件的维护也成...

    2024-02-29 11:39:34