这个例子也很好的抽象出了事物结构。
可选属性 和 只读属性
在使用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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
结尾
正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。
以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。
3562166340)]
[外链图片转存中…(img-oxqXWnYM-1713562166341)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
[外链图片转存中…(img-y7rlHrVd-1713562166341)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
[外链图片转存中…(img-v1MNKjd2-1713562166341)]
结尾
正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。
以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。