介绍

TypeScript 的核心原则之一是对值所具有的结构进行类型检查。我们使用接口(Interfaces)来定义对象的类型。接口是对象的状态(属性)和行为(方法)的抽象(描述)

接口初探

声明接口需要使用关键字interface,接下来我们定义一个接口,需求如下

需求: 创建人的对象, 需要对人的属性进行一定的约束

id是number类型, 必须有, 只读的
name是string类型, 必须有
age是number类型, 必须有
sex是string类型, 可以没有

第一步:创建人的对象

const person: Person = {
id: 1,
name: 'tom',
age: 20,
sex: '男'
}

我们创建了一个类型为Person的person对象,里面的属性有id、name、age、sex

第二步:给person对象声明类型,第一步的时候我们声明了类型Person,但是这个类型具体是什么,我们还没定义,所以接下来我们定义一个接口Person,来声明是person对象的类型

interface Person {
id: number
name: string
age: number
sex: string
}

此时呢,就已经创建好一个没有约束的对象person,他的类型声明是接口Person,接下来加上约束就完整了。

第三步:添加约束,id属性只能是只读,sex属性为可选属性

要将一个属性设置为只读很简单,只需要在属性前面增加关键字readonly,设置属性为可选属性也很简单,只需在属性后面添加符号?,最后完整的代码如下

interface Person {
readonly id: number
name: string
age: number
sex?: string
} const person: Person = {
id: 1,
name: 'tom',
age: 20,
sex: '男'
} console.log(person)

第四步:测试我们定义的对象,首先我们在浏览器中查看是否打印了这个对象



由于id是只读的,我们测试修改id是否报错



很明显,这里报错了,说id是个只读属性

又由于sex是可选属性,所以我们不设置sex,看看是否成功

const person: Person = {
id: 1,
name: 'tom',
age: 20,
} console.log(person)



可以看到也是能打印出来的

可选属性

接口里的属性不全都是必需的。 有些是只在某些条件下存在,或者根本不存在。

interface IPerson {
id: number
name: string
age: number
sex?: string
}

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

好处:

  • 可以对可能存在的属性进行预定义
  • 可以捕获引用了不存在的属性时的错误。
const person2: IPerson = {
id: 1,
name: 'tom',
age: 20,
// sex: '男' // 可以没有
}

只读属性

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

interface Person {
readonly id: number
name: string
age: number
sex?: string
}

一旦赋值后再也不能被改变了。

const person2: IPerson = {
id: 2,
name: 'tom',
age: 20,
// sex: '男' // 可以没有
// xxx: 12 // error 没有在接口中定义, 不能有
}
person2.id = 2 // error

readonly vs const

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

函数类型

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

 

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

interface SearchFunc {
(source: string, subString: string): boolean;
}

这样定义后,我们可以像使用其它接口一样使用这个函数类型的接口。 下例展示了如何创建一个函数类型的变量,并将一个同类型的函数赋值给这个变量。

let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
let result = source.search(subString);
return result > -1;
}

对于函数类型的类型检查来说,函数的参数名不需要与接口里定义的名字相匹配。 比如,我们使用下面的代码重写上面的例子:

let mySearch: SearchFunc;
mySearch = function(src: string, sub: string): boolean {
let result = src.search(sub);
return result > -1;
}

函数的参数会逐个进行检查,要求对应位置上的参数类型是兼容的。 如果你不想指定类型,TypeScript的类型系统会推断出参数类型,因为函数直接赋值给了 SearchFunc类型变量。 函数的返回值类型是通过其返回值推断出来的(此例是 false和true)。 如果让这个函数返回数字或字符串,类型检查器会警告我们函数的返回值类型与 SearchFunc接口中的定义不匹配。

let mySearch: SearchFunc;
mySearch = function(src, sub) {
let result = src.search(sub);
return result > -1;
}

类类型

类实现接口

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

// 定义一个接口,里面有个空方法run
interface IRun {
run()
} // 定义一个类,实现接口IRun
class Person implements IRun{
run() {
console.log('我正在跑步')
}
} // 穿改进类对象person
const person = new Person()
// 运行run方法
person.run()

一个类实现多个接口

interface IRun {
run()
}
interface Swim {
swim()
} // 定义一个类,这个类可以实现IRun和Swim接口(当前这个类可以实现多个接口,一个类同时也可以被多个接口进行约束)
class Person2 implements IRun, Swim{
run() {
console.log('我正在跑步2')
}
swim() {
console.log('我正在游泳2')
}
} const person2 = new Person2()
person2.run()
person2.swim()



总结:类可以通过接口的方式,来定义当前这个类的类型,类可以实现一个接口,也可以实现多个接口,要注意:接口中的内容要真正的实现

接口继承接口

// 定义了一个接口,继承了其他多个接口
interface IRun {
run()
}
interface Swim {
swim()
} // 接口runSwim继承了IRun和Swim
interface runSwim extends IRun, Swim{} // 类实现接口runSwim,因为继承关系,类可以调用继承接口中的方法
class Person3 implements runSwim{
run() {
console.log('我正在跑步3')
}
swim() {
console.log('我正在游泳3')
}
} const person3 = new Person3()
person3.run()
person3.swim()

TypeScript(4)接口的更多相关文章

  1. TypeScript入门五:TypeScript的接口

    TypeScript接口的基本使用 TypeScript函数类型接口 TypeScript可索引类型接口 TypeScript类类型接口 TypeScript接口与继承 一.TypeScript接口的 ...

  2. TypeScript 素描 - 接口

    /* 接口 C#写多了,接口也自然也是理解的.不过TypeScript中的接口与 C#中的还是有些区别的 接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约 */ //为方法的参数做契约 i ...

  3. TypeScript之接口类型

    Interfaces 作为TypeScript中的核心特色之一,能够让类型检查帮助我们知道一个对象应该有什么,相比我们在编写JavaScript的时候经常遇到函数需要传递参数,可能在编写的时候知道这个 ...

  4. TypeScript Interface(接口)

    类型检查专注于解析值所具有的"形态",这是TypeScript的核心原则之一.这个有时候被称为"duck typing"或者"structural s ...

  5. TypeScript入门-接口

    ▓▓▓▓▓▓ 大致介绍 在TypeScript里,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约. ▓▓▓▓▓▓ 接口 例子: function printLabel(labelledO ...

  6. typescript - 5.接口

    接口的作用: 在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用.接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不 ...

  7. Angular2入门:TypeScript的接口

  8. TypeScript之接口

    1.写法 // 属性 interface Person { name:string; age:number; hobby: string; } // 函数 interface  { todo(para ...

  9. TypeScript学习笔记(五):接口

    使用接口 在前面的笔记中我们知道可以使用Object Type来指定参数的属性,如下: function printLabel(labelledObj: {label: string}) { cons ...

  10. TypeScript学习指南第二章--接口(Interface)

    接口(Interface) TypeScript的核心机制之一在于它的类型检查系统(type-checker)只关注一个变量的"模型(shape)" 稍后我们去了解这个所谓的形状是 ...

随机推荐

  1. 如何满足一个前端对 Mock 的全部幻想

    ​ 前端的痛苦 作为前端,最痛苦的是什么时候? 每个迭代,需求文档跟设计稿都出来了,静态页面唰唰两天就做完了.可是做前端又不是简单地把后端吐出来的数据放到页面上就完了,还有各种前端处理逻辑啊. 后端接 ...

  2. Gitlab图床配置

    注意,使用图床,如果文件在外网打开,图片不会正常显示,因为图片存储在内部的Gitlab服务器上 自行搜索Picgo安装配置,需要安装node.js ​ 项目链接:D-W-X/picgo-plugin- ...

  3. 第十三届蓝桥杯省赛C/C++ B组

    @(第十三届蓝桥杯省赛C/C++B组) A顺子日期 答案是1478 B顺子日期 答案14(如果012算的话) C刷题统计 数据范围1e18,所以不能直接暴力,先取余,再暴力剩下的 #include&l ...

  4. 阶段性总结linux(1)

    学习安装linux系统 [网络连接方式] 桥接 ,好比所有人都在25期教室,公用这个教室的局域网段 192.168.11.0~192.168.11.255 教室内有60个同学,插上了网线,所有人都是 ...

  5. vue--vuex 中 Modules 详解

    前言 在Vue中State使用是单一状态树结构,应该的所有的状态都放在state里面,如果项目比较复杂,那state是一个很大的对象,store对象也将对变得非常大,难于管理.于是Vuex中就存在了另 ...

  6. vite创建vue3+ts项目流程

    vite+vue3+typescript搭建项目过程   vite和vue3.0都出来一段时间了,尝试一下搭vite+vue3+ts的项目 相关资料网址 vue3.0官网:https://v3.vue ...

  7. .NET MAUI RC2 发布,支持 Tizen 平台

    在.NET多平台应用程序UI(.NET MAUI)RC1之后仅两周,微软已经发布了RC2,并以新的Tizen支持为亮点..NET MAUI是微软对Xamarin.Forms的演变,因为它除了iOS和A ...

  8. C# 核心

    C# 核心 面向对象编程概念 面向过程编程是一种以过程为中心的编程思想,分析出解决问题所需要的步骤,然后有函数把步骤一步一步实现,使用的时候一个一个依次调用. 面向对象是一种对现实世界理解和抽象的编程 ...

  9. Azure Service Fabric 踩坑日志

    近期项目上面用到了Azure Service Fabric这个服务,它是用来做微服务架构的,由于这套代码和架构都是以前同学留下来的,缺少文档,项目组在折腾时也曾遇到几个问题,这里整理如下,以供参考. ...

  10. Docker容器网络-基础篇

    开源Linux 一个执着于技术的公众号 Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/N ...