TypeScript系列教程七《接口》

这个例子也很好的抽象出了事物结构。

可选属性 和 只读属性

在使用TS接口或者类型定义的时候,我们经常会遇到一个属性只有在一种场景下需要传递,另一种场景不需要传递,但是不传还报错,如果必须传值弄的编程歧义过大。这时候可选属性出现了。

可选链式现代设计语言都会去设计的,配置类型安全去搭配使用。

下面的例子可以看出:

在这里插入图片描述

学生不需要去使用工作属性,那么这个属性应该可选。

interface Person {

study?:‘poor’ | ‘hard’

work?:‘hard’ | ‘lazy’

}

let student:Person = {

study:‘hard’

}

只读属性不多赘述,只能读取不能set:

在这里插入图片描述

额外属性

有时候定义一个接口想的不是很全面,或者有预留的空间,这时候可以使用额外属性。

比如学生是人,人是可以跑的,但是不如我们所愿,因为我们没有给人定义跑的属性,这未免太死板:

在这里插入图片描述

我们可以使用额外属性扩充这个问题:

interface Person {

readonly study?:‘poor’ | ‘hard’

work?:‘hard’ | ‘lazy’

}

let student:Person = {

study:‘hard’,

run:true

}

函数接口

接口能够描述JavaScript中对象拥有的各种各样的外形。 除了描述带有属性的普通对象外,接口也可以描述函数类型。

为了使用接口表示函数类型,我们需要给接口定义一个调用签名。 它就像是一个只有参数列表和返回值类型的函数定义。参数列表里的每个参数都需要名字和类型。

interface Eat {

(food:string):‘hungry’ | ‘full’

}

interface Person {

readonly study?:‘poor’ | ‘hard’

work?:‘hard’ | ‘lazy’

eat:Eat

}

function studentEat(food:string) :‘hungry’ | ‘full’{

console.log(学生去食堂吃${food});

return ‘full’

}

let studentEatArrow:Eat = (food:string) => {

console.log(学生去食堂吃${food});

return ‘full’

}

let student:Person = {

study:‘hard’,

eat:studentEat,

run:true

}

函数类型检查不会检查参数名,参数个数和格式对应即可:

let studentEatArrow:Eat = (nofood:string) => {

console.log(学生去食堂吃${nofood});

return ‘full’

}

let student:Person = {

study:‘hard’,

eat:studentEatArrow,

run:true

}

可索引的类型

typescript 可以通过索引得到类型,下面我们自定义一个数组类型:

interface MyArray {

[index:number] : T

}

let array:MyArray = [“1”,“9”]

TypeScript支持两种索引签名:字符串和数字。 可以同时使用两种类型的索引,但是数字索引的返回值必须是字符串索引返回值类型的子类型。 这是因为当使用 number来索引时,JavaScript会将它转换成string然后再去索引对象。 也就是说用 100(一个number)去索引等同于使用"100"(一个string)去索引,因此两者需要保持一致。

扩展使用,有些时候我们想通过key字符串取值,需要声明对象key类型:

export interface StringElement {

}

export interface StringArrayMap {

}

类类型

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

interface ClockInterface {

currentTime: Date;

}

class Clock implements ClockInterface {

currentTime: Date;

constructor(cDate:Date) {

this.currentTime = cDate

}

}

你也可以在接口中描述一个方法,在类里实现它,如同下面的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) { }

}

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

类静态部分与实例部分的区别

构造函数属于静态部分,无法进行类型检查。

这里因为当一个类实现了一个接口时,只对其实例部分进行类型检查。 constructor存在于类的静态部分,所以不在检查的范围内。

因此,我们应该直接操作类的静态部分。 看下面的例子,我们定义了两个接口, ClockConstructor为构造函数所用和ClockInterface为实例方法所用。 为了方便我们定义一个构造函数 createClock,它用传入的类型创建实例。

interface ClockConstructor {

new (hour: number, minute: number): ClockInterface;

}

interface ClockInterface {

tick():void;

}

function createClock(ctor: ClockConstructor, hour: number, minute: number): ClockInterface {

return new ctor(hour, minute);

}

class DigitalClock implements ClockInterface {

constructor(h: number, m: number) { }

tick() {

console.log(“beep beep”);

}

}

class AnalogClock implements ClockInterface {

constructor(h: number, m: number) { }

tick() {

console.log(“tick tock”);

}

}

let digital = createClock(DigitalClock, 12, 17);

let analog = createClock(AnalogClock, 7, 32);

&nbpp;

继承接口

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

interface Shape {

color: string;

}

interface Square extends Shape {

sideLength: number;

}

let 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.color = “blue”;

square.sideLength = 10;

square.penWidth = 5.0;

&nbpp;

混合类型

先回到js,函数可以作为对象使用。

var person = function () { };

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

结尾

正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。

以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。

戳这里免费领取前端学习资料

3562166340)]

[外链图片转存中…(img-oxqXWnYM-1713562166341)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

[外链图片转存中…(img-y7rlHrVd-1713562166341)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

[外链图片转存中…(img-v1MNKjd2-1713562166341)]

结尾

正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。

以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。

戳这里免费领取前端学习资料

前端学习书籍导图-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值