TypeScript:interface与type

cover.png

1. interface 和 type 的定义

首先,我们来看看 interface 和 type 的定义。在 TypeScript 中,interface 是一种声明对象的结构,它描述了对象应该具有的属性和方法。而 type 是用来定义自定义类型的关键字,它可以表示任何类型,不仅限于对象。

我们来看一个简单的例子:

interface Person {
  name: string;
  age: number;
}

type Point = {
  x: number;
  y: number;
};

在上面的例子中,我们定义了一个 Person 接口和一个 Point 类型。Person 接口要求一个对象具有 nameage 属性,而 Point 类型则表示一个具有 xy 属性的对象。

2. interface 和 type 的语法差异

虽然 interface 和 type 有相似的作用,但它们的语法有一些细微的差异。

interface 语法

interface 的语法比较简单,我们只需要使用关键字 interface 加上一个名称来定义它:

interface Person {
  name: string;
  age: number;
}

type 语法

type 的语法稍微有些复杂一些,我们需要使用关键字 type 并给它一个名称:

type Point = {
  x: number;
  y: number;
};

需要注意的是,type 还可以使用 = 来定义一个类型别名:

type MyString = string;

上面的代码定义了一个类型别名 MyString,它表示一个字符串类型。

3. interface 和 type 的扩展能力

interface 和 type 在扩展能力上也有一些差异。我们来看看它们的不同之处。

interface 的扩展

在 interface 中,我们可以使用 extends 关键字来扩展其他接口。这意味着一个接口可以继承另一个接口的属性和方法。

interface Animal {
  name: string;
  age: number;
}

interface Dog extends Animal {
  breed: string;
}

在上面的例子中,我们定义了一个 Animal 接口和一个 Dog 接口。Dog 接口通过 extends 关键字扩展了 Animal 接口,因此它拥有了 Animal 接口中的 nameage 属性,并且还额外定义了一个 breed 属性。

type 的扩展

与 interface 不同,type 使用 & 来扩展

其他类型。这意味着一个类型可以合并其他类型的属性。

type Person = {
  name: string;
  age: number;
};

type Employee = {
  company: string;
};

type EmployeePerson = Person & Employee;

在上面的例子中,我们定义了一个 Person 类型和一个 Employee 类型。然后,我们使用 & 将这两个类型合并成了一个新的类型 EmployeePerson。这样,EmployeePerson 就拥有了 Person 和 Employee 中的所有属性。

4. interface 和 type 的可选属性和只读属性

在 TypeScript 中,我们经常需要定义可选属性和只读属性。那么,interface 和 type 如何处理这些特性呢?让我们来看看。

interface 的可选属性和只读属性

在 interface 中,我们可以使用 ? 来定义可选属性,使用 readonly 来定义只读属性。

interface Person {
  name: string;
  age?: number; // 可选属性
  readonly id: number; // 只读属性
}

在上面的例子中,age 属性是可选的,而 id 属性是只读的。只读属性表示一旦赋值后就不能再被修改。

type 的可选属性和只读属性

在 type 中,我们使用 ?readonly 关键字来定义可选属性和只读属性。

type Person = {
  name: string;
  age?: number; // 可选属性
  readonly id: number; // 只读属性
};

上面的代码与 interface 中的定义是等价的。

5. interface 和 type 的适用场景

到目前为止,我们已经了解了 interface 和 type 的基本概念和语法。接下来,我们将讨论它们在不同场景下的应用。

interface 的适用场景

interface 适用于描述对象的结构和行为。如果你需要定义一个对象的属性和方法,并且希望其他对象可以通过继承来共享这些属性和方法,那么 interface 是一个不错的选择。

interface Shape {
  name: string;
  area(): number;
}

上面的例子中,我们定义了一个 Shape 接口,它包含了一个 name 属性和一个计算面积的 area 方法。如果有多个形状,比如 Circle 和 Rectangle,都需要具有这些属性和方法,那么它们可以分别实现 Shape 接口。

type 的适用场景

type 则适用于定义自定义类型。当你需要创建一个具有特定结构的类型,而不仅仅是对象时,type 是一个更好的选择。

type MyString = string;

上面的例子中,我们创建了一个类型别名 MyString,它表示一个字符串类型。这样,在代码中可以直接使用 MyString 来表示字符串类型。

6. interface 和 type 的相互转换

有时候,我们可能需要将 interface 转换为 type,或者将 type 转换为 interface。在 TypeScript 中,这是可以实

现的。

interface 转换为 type

要将 interface 转换为 type,我们可以使用 type 关键字和 typeof 运算符。

interface Person {
  name: string;
  age: number;
}

type PersonType = typeof Person;

在上面的例子中,我们使用 typeof 运算符将 Person 接口转换为对应的类型 PersonType。这样,PersonType 将拥有 Person 接口中定义的所有属性和方法。

type 转换为 interface

要将 type 转换为 interface,我们可以使用 interface 关键字并重新定义类型的结构。

type Point = {
  x: number;
  y: number;
};

interface PointInterface extends Point {}

在上面的例子中,我们使用 interface 关键字将 Point 类型转换为对应的接口 PointInterface。这样,PointInterface 将具有 Point 类型中定义的属性。

结论

到这里,我们对于 TypeScript 中的 interface 和 type 已经有了深入的了解。虽然它们在某些方面有一些差异,但它们都是用来定义类型的强大工具。在实际开发中,你可以根据具体情况选择使用 interface 或 type,或者甚至将它们结合起来使用。

示例代码仅用于说明概念,可能不符合最佳实践。在实际开发中,请根据具体情况进行调整。

全部评论

相关推荐

07-31 14:08
门头沟学院 Java
点赞 评论 收藏
分享
06-13 17:33
门头沟学院 Java
顺序不记了,大致顺序是这样的,有的相同知识点写分开了1.基本数据类型2.基本数据类型和包装类型的区别3.==和equals区别4.ArrayList与LinkedList区别5.hashmap底层原理,put操作时会发生什么6.说出几种树型数据结构7.B树和B+树区别8.jvm加载类机制9.线程池核心参数10.创建线程池的几种方式11.callable与runnable区别12.线程池怎么回收线程13.redis三剑客14.布隆过滤器原理,不要背八股,说说真正使用时遇到了问题没有(我说没有,不知道该怎么回答了)15.堆的内存结构16.自己在写项目时有没有遇见过oom,如何处理,不要背八股,根据真实经验,我说不会17.redis死锁怎么办,watchdog机制如何发现是否锁过期18.如何避免redis红锁19.一个表性别与年龄如何加索引20.自己的项目的QPS怎么测的,有没有真正遇到大数量表21.说一说泛型22.springboot自动装配原理23.springmvc与springboot区别24.aop使用过嘛?动态代理与静态代理区别25.spring循环依赖怎么解决26.你说用过es,es如何分片,怎么存的数据,1000万条数据怎么写入库中27.你说用limit,那么在数据量大之后,如何优化28.rabbitmq如何批次发送,批量读取,答了延迟队列和线程池,都不对29.计网知不知道smtp协议,不知道写了对不对,完全听懵了30.springcloud知道嘛?只是了解反问1.做什么的?短信服务,信息量能到千万级2.对我的建议,基础不错,但是不要只背八股,多去实际开发中理解。面试官人不错,虽然没露脸,但是中间会引导我回答问题,不会的也只是说对我要求没那么高。面完问我在济宁生活有没有困难,最快什么时候到,让人事给我聊薪资了。下午人事打电话,问我27届的会不会跑路,还在想办法如何使我不跑路,不想扣我薪资等。之后我再联系吧,还挺想去的😭,我真不跑路哥😢附一张河科大幽默大专图,科大就是大专罢了
查看30道真题和解析
点赞 评论 收藏
分享
水色铃音:可以去找射频相关的岗位,比如圣邦微?或者像做产品的,比如xiaomi,oppovivo之类的,都需要天线调试的工程师
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务