首页 > 其他分享 >TypeScript新手学习教程--接口

TypeScript新手学习教程--接口

时间:2024-10-16 17:19:29浏览次数:8  
标签:Control TypeScript -- number 接口 color interface 新手 属性

TypeScript 也支持接口,跟Java类似,这对于学习过java,c#,php语言的人更容易上手,虽然类似,但是也有不同,下面开始学习。

1、 接口声明

TypeScript的核心原则之一是对值所具有的结构进行类型检查。 它有时被称做“鸭式辨型法”或“结构性子类型化”。 在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约。

写一个必须包含一个label属性且类型为string接口示例

interface LabelledValue {
  label: string;
}

function printLabel(labelledObj: LabelledValue) {
  console.log(labelledObj.label);
}

let myObj = {size: 10, label: "Size 10 Object"};
printLabel(myObj);

注:接口声明的关键词“interface”

2、接口可选属性使用

接口里的属性不全都是必需的。 有些是只在某些条件下存在,或者根本不存在。 可选属性在应用“option bags”模式时很常用,即给函数传入的参数对象中只有部分属性赋值了。

下面是应用了“option bags”的例子:

interface SquareConfig {
  color?: string;
  width?: number;
}

function createSquare(config: SquareConfig): {color: string; area: number} {
  let newSquare = {color: "white", area: 100};
  if (config.color) {
    newSquare.color = config.color;
  }
  if (config.width) {
    newSquare.area = config.width * config.width;
  }
  return newSquare;
}

let mySquare = createSquare({color: "black"});

带有可选属性的接口与普通的接口定义差不多,只是在可选属性名字定义的后面加一个?符号。

注:可选属性关键词为“?”符号

3、接口只读属性使用

一些对象属性只能在对象刚刚创建的时候修改其值。 你可以在属性名前用readonly来指定只读属性:

interface Point {
    readonly x: number;
    readonly y: number;
}

你可以通过赋值一个对象字面量来构造一个Point。 赋值后,xy再也不能被改变了。

let p1: Point = { x: 10, y: 20 };
p1.x = 5; // error!

TypeScript具有ReadonlyArray<T>类型,它与Array<T>相似,只是把所有可变方法去掉了,因此可以确保数组创建后再也不能被修改:

let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
ro[0] = 12; // error!
ro.push(5); // error!
ro.length = 100; // error!
a = ro; // error!

上面代码的最后一行,可以看到就算把整个ReadonlyArray赋值到一个普通数组也是不可以的。 但是你可以用类型断言重写:

a = ro as number[];

注:只读属性关键词为“readonly

4、readonly vs const

最简单判断该用readonly还是const的方法是看要把它做为变量使用还是做为一个属性。 做为变量使用的话用const,若做为属性则使用readonly

5、接口实现接口

与C#或Java里接口的基本作用一样,TypeScript也能够用它来明确的强制一个类去符合某种契约。

interface ClockInterface {
    currentTime: Date;
}

class Clock implements ClockInterface {
    currentTime: Date;
    constructor(h: number, m: number) { }
}

你也可以在接口中描述一个方法,在类里实现它,如同下面的setTime方法一样:

interface ClockInterface {
    currentTime: Date;
    setTime(d: Date);
}

class Clock implements ClockInterface {
    currentTime: Date;
    setTime(d: Date) {
        this.currentTime = d;
    }
    constructor(h: number, m: number) { }
}

接口描述了类的公共部分,而不是公共和私有两部分。 它不会帮你检查类是否具有某些私有成员。

注:实现接口关键词为“implements

6、接口继承接口

和类一样,接口也可以相互继承。 这让我们能够从一个接口里复制成员到另一个接口里,可以更灵活地将接口分割到可重用的模块里。

interface Shape {
    color: string;
}

interface Square extends Shape {
    sideLength: number;
}

let square = <Square>{};
square.color = "blue";
square.sideLength = 10;

一个接口可以继承多个接口,创建出多个接口的合成接口。

interface Shape {
    color: string;
}

interface PenStroke {
    penWidth: number;
}

interface Square extends Shape, PenStroke {
    sideLength: number;
}

let square = <Square>{};
square.color = "blue";
square.sideLength = 10;
square.penWidth = 5.0;

注:继承接口关键词为“extends

7、接口混合类型使用

先前我们提过,接口能够描述JavaScript里丰富的类型。 因为JavaScript其动态灵活的特点,有时你会希望一个对象可以同时具有上面提到的多种类型。

一个例子就是,一个对象可以同时做为函数和对象使用,并带有额外的属性。

interface Counter {
    (start: number): string;
    interval: number;
    reset(): void;
}

function getCounter(): Counter {
    let counter = <Counter>function (start: number) { };
    counter.interval = 123;
    counter.reset = function () { };
    return counter;
}

let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;

在使用JavaScript第三方库的时候,你可能需要像上面那样去完整地定义类型。

8、接口继承类

当接口继承了一个类类型时,它会继承类的成员但不包括其实现。 就好像接口声明了所有类中存在的成员,但并没有提供具体实现一样。 接口同样会继承到类的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 {

}

// Error: Property 'state' is missing in type 'Image'.
class Image implements SelectableControl {
    select() { }
}

class Location {

}

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

Control类内部,是允许通过SelectableControl的实例来访问私有成员state的。 实际上,SelectableControl就像Control一样,并拥有一个select方法。 ButtonTextBox类是SelectableControl的子类(因为它们都继承自Control并有select方法),但ImageLocation类并不是这样的。

注:接口继承类关键词为“extends

注:具体请去看官网文档,可以深入学习

标签:Control,TypeScript,--,number,接口,color,interface,新手,属性
From: https://blog.csdn.net/xzp19841203xzp/article/details/142986135

相关文章

  • Python学习的自我理解和想法(13)
    学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码!今天是学Python的第13天,学的内容是模块入门以及pip引入,后面估计是一天一个模块。开学了,时间不多,写得不多,见谅。目录1.模块入门2.模块导入语法(1).import(2)form模块名import方法名或变量名(3)form模块名import*......
  • 深入探讨 Python 高级话题
    Python是一门灵活的高级编程语言,提供了许多独特的高级特性。这些特性不仅帮助开发者编写简洁、优雅的代码,还能提升代码的性能和可扩展性。在本篇博客中,我们将深入探讨一些高级话题,如元编程、动态类型、垃圾回收、内存管理、高性能计算等。11.1元编程与 type()元编程 是指......
  • Idea序列图插件-SequenceDiagram Core
    简介SequenceDiagramCore是一个IntelliJIDEA插件,它允许开发者直接在IDE中创建和编辑序列图(SequenceDiagrams)。序列图是UML(统一建模语言)中的一种图表类型,用于描述对象之间如何交互以及这些交互的顺序。这种类型的图表对于理解复杂的系统流程、设计模式或者组件之间......
  • 探索 Python 的测试与调试技巧
    测试和调试是开发软件时至关重要的步骤,它们可以确保代码的正确性、稳定性和性能。Python提供了强大的工具来简化测试和调试流程。在本篇博客中,我们将讨论Python中的单元测试、pytest 测试框架、调试与日志记录,以及性能优化与剖析工具的使用。10.1单元测试与 unittest单......
  • 探索 Python Web 开发:从框架到爬虫
    Python是Web开发中广泛使用的编程语言,因其简单、灵活和强大的生态系统,适合构建各种类型的Web应用和API。在本篇博客中,我们将讨论Web开发的几个重要主题,包括Flask和Django框架、API开发、HTTP请求处理以及网页爬虫的基础。9.1Flask框架基础Flask是一个轻量级......
  • Python学习的自我理解和想法(10)
    学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码!今天是学Python的第10天,学的内容是函数。开学了,时间不多,写得不多,见谅。目录1.函数入门2.函数使用说明1.定义函数2.函数组成3.函数命名4.函数参数5.函数易忘点6.函数的调用3.函数调用时的注意事项4.函数的参数(1......
  • qt页面设计
    1.Designer设计师(掌握)Designer是Qt内置的一款界面设计程序,设计的界面文件为.ui格式。C++程序员通常不会单独启动Designer,如果要在项目中使用Designer程序,只需要在新建项目时,勾选“创建界面文件”选项。这样的项目自带dialog.ui,双击dialog.ui可以直接使用Designer程序......
  • ssm果蔬销售商城vue 协同过滤算法 echart可视化springboot
    目录项目介绍系统实现截图协同过滤算法B/S架构技术介绍核心代码部分展示论文结构其他springboot项目推荐系统测试详细视频演示果蔬销售商城源码获取项目介绍ssm果蔬销售商城果蔬销售系统—便于商家记录销售情况同时方便消费者购买水果蔬菜的电商平台前台用户模块:......
  • Python入门:A+B问题
    1.A+B问题I前言本篇作为课程第一篇,主要是对Python基础语法进行扫盲,本节课会学习到下面知识:输入本道题目的工作任务很简单,只是计算两个数的和,但是在计算之前,我们首先要明确的一个问题就是如何把这两个数据输入到计算机中,并由程序读取呢?输入当然是使用键盘之类的输入设备完......
  • [vue] 在vue中手动实现下拉刷新功能
    1.下拉刷新组件<template><divclass="box"ref="boxRef"@touchstart="touchstart"@touchmove="touchmove"@touchend="touchend":style="style"><slot/>......