面试官:ts中 interface和type有什么区别和异同点

在这里插入图片描述

在 TypeScript 中,interfacetype 可以用来定义对象的结构和类型

它们的区别和异同点如下:

1. 语法

interface 使用 interface 关键字定义,而 type 使用 type 关键字定义。

2. 声明合并

interface 支持声明合并,这意味着可以多次声明同一个接口,并且它们会被合并为一个接口。而 type 不支持声明合并。

当我们【多次声明同一个接口】时,它们【会被合并为一个接口】。下面是一个示例代码:

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

interface Person {
  gender: string;
}

const person: Person = {
  name: "John",
  age: 30,
  gender: "male",
};

在上面的代码中,我们首先声明了一个 Person 接口,包含 nameage 属性。然后我们又声明了一个 Person 接口,包含 gender 属性。这两个声明会被合并为一个接口,即最终的 Person 接口包含了 nameagegender 三个属性。

在实际使用中,可以将多次声明接口的功能应用于拆分接口的情况。例如,一个接口可能在不同的地方被定义,我们可以使用多次声明来分别添加属性,从而实现接口的拆分和扩展。这种方式可以帮助我们更好地组织和维护大型代码库中的类型定义。

3. 写法

interface 更多地用于声明对象的结构,而 type 可以用于声明对象的结构、联合类型、交叉类型等。

当使用 interface 声明对象结构时,可以定义对象包含的属性和方法。以下是一个简单的示例:

interface Person {
  name: string;
  age: number;
  greet(): void;
}

const person: Person = {
  name: "Alice",
  age: 25,
  greet() {
    console.log("Hello!");
  },
};

在上面的示例中,我们定义了一个 Person 接口,它有 nameage 属性和 greet 方法。然后我们使用该接口来声明 person 对象,确保它满足 Person 接口的结构要求。

这样我们就可以使用 person 对象中的属性和方法,例如 person.nameperson.ageperson.greet()

请注意,接口只定义了结构,而实际的对象是通过赋值给变量来创建的。
请注意,接口只定义了结构,而实际的对象是通过赋值给变量来创建的。
请注意,接口只定义了结构,而实际的对象是通过赋值给变量来创建的。

是的,type 不仅可以用于声明对象的结构,还可以用于声明联合类型、交叉类型等复杂类型。以下是一些示例:

1. 对象结构

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

const person: Person = {
  name: "Alice",
  age: 25,
};

与使用 interface 类似,上述示例中使用 type 声明了一个 Person 类型,具有 nameage 属性。然后我们可以使用该类型声明 person 对象。

2. 联合类型 |

type ID = string | number;

const userId: ID = "123";
const postId: ID = 456;

在上述示例中,我们使用 type 声明了一个 ID 类型,它可以是 stringnumber。然后我们可以使用该类型声明 userIdpostId 变量,分别赋予不同的值。

3. 交叉类型 &

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

const point: Point = {
  x: 10,
  y: 20,
};

在上述示例中,我们使用 type 声明了一个 Point 类型,它由 { x: number }{ y: number } 两个类型通过 & 运算符形成。这表示 Point 类型的对象必须同时具有 xy 属性。

这只是 type 的一些用法示例,它可以用于更多的复杂类型定义,例如函数类型、元组类型等。type 的灵活性使得它成为一个强大的类型声明工具。

4. 继承实现

interface 可以通过 extends 关键字来继承其他接口,可以继承多个接口。
type 可以通过 & 运算符来实现交叉类型,可以合并多个类型。

是的,使用 interface 可以通过 extends 关键字来继承其他接口,并且可以继承多个接口。以下是一个示例:

interface Shape {
  color: string;
}

interface Circle extends Shape {
  radius: number;
}

interface Square extends Shape {
  sideLength: number;
}

interface ColoredShape extends Circle, Square {
  borderColor: string;
}

在上述示例中,我们定义了一个 Shape 接口,它有一个 color 属性。然后我们定义了 CircleSquare 接口,它们分别继承了 Shape 接口,并添加了各自的属性。

最后,我们定义了一个 ColoredShape 接口,它同时继承了 CircleSquare 接口,并添加了自己的属性 borderColor。这样,ColoredShape 接口具有 colorradiussideLengthborderColor 四个属性。

通过接口继承,我们可以实现接口的复用和组合,以便更好地描述对象的结构。

是的,你可以使用 type& 运算符来实现交叉类型,并且可以合并多个类型。以下是一个示例:

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

type Employee = {
  id: number;
  department: string;
}

type Manager = Person & Employee;

const manager: Manager = {
  name: "John",
  age: 35,
  id: 123,
  department: "Sales"
};

在上述示例中,我们定义了 PersonEmployee 两个类型。然后,我们使用 type& 运算符将它们合并为 Manager 类型。

Manager 类型拥有 PersonEmployee 类型的所有属性,相当于是两个类型的交叉结果。

最后我们创建了一个 manager 对象,它符合 Manager 类型的定义,同时具有 nameageiddepartment 四个属性。

使用交叉类型,我们可以将多个类型合并到一个新的类型中,以便更灵活地描述对象的结构。

5. 可索引类型

interface 可以通过索引签名来定义可索引类型。而 type 不能直接定义可索引类型,但可以通过交叉类型间接实现。

当我们使用 interface 来定义一个对象类型时,我们可以通过索引签名来定义可索引类型。索引签名允许我们使用索引访问对象中的属性。

下面是一个使用索引签名定义可索引类型的代码案例:

interface MyObj {
  [key: string]: number;
}

const obj: MyObj = {
  a: 1,
  b: 2,
};

console.log(obj.a); // Output: 1
console.log(obj.b); // Output: 2

在上面的例子中,我们定义了一个名为 MyObj 的接口,它使用了索引签名 [key: string]: number; 来表示对象可以具有任意的字符串属性名,而属性值则必须是数字类型。然后我们创建了一个 obj 实例,它符合 MyObj 接口的定义,并给它赋予了一些属性值。

通过索引访问符号 .,我们可以直接访问 obj 对象的属性,如 obj.aobj.b,它们的值分别为 1 和 2。

需要注意的是,索引签名可以是字符串类型 (string) 或者数字类型 (number),但不能同时出现。此外,当我们定义了索引签名时,可以使用其他固定属性或方法,但这些固定属性或方法不能违反索引签名定义的约束。

希望这个例子能够帮助你理解 interface 中可索引类型的使用。

总的来说,interface 更适用于声明对象的结构,支持声明合并和继承其他接口type 则更灵活,可以用于声明复杂类型、联合类型和交叉类型等。在使用上,根据具体需求和个人偏好选择使用 interface 还是 type

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值