【TS高频面试题】interface与type的区别
参考文章
一、基本概念
1. type(类型别名)
用来给一个类型起新名字,使用 type 创建类型别名。
2. interface(接口)
专门用于定义对象的结构(比如属性和方法)
二、相同点
(1)都可以描述对象或函数
interface
interface User {
name: string
age: number
}
interface SetUser {
(name: string, age: number): void;
}
type
type User = {
name: string
age: number
};
type SetUser = (name: string, age: number)=> void;
(2)都允许继承
在 TypeScript 中,interface 和 type 可以相互继承。
在 TypeScript 中,interface
和 type
可以相互继承,具体如下:
1. interface
可以继承 interface
这是最常见的用法。一个 interface
可以通过 extends
继承另一个 interface
。
interface Person {
name: string;
}
interface Employee extends Person {
employeeId: number;
}
const emp: Employee = {
name: "Alice",
employeeId: 123
};
2. interface
可以继承 type
interface
也可以通过 extends
继承一个 type
,因为 type
也可以定义对象结构。
type Person = {
name: string;
};
interface Employee extends Person {
employeeId: number;
}
const emp: Employee = {
name: "Bob",
employeeId: 456
};
3. type
可以继承 interface
type
可以通过交叉类型(&
)继承 interface
。交叉类型会将多个类型合并为一个新类型。
interface Person {
name: string;
}
type Employee = Person & {
employeeId: number;
};
const emp: Employee = {
name: "Charlie",
employeeId: 789
};
4. type
可以继承 type
type
可以通过交叉类型继承另一个 type
。
type Person = {
name: string;
};
type Employee = Person & {
employeeId: number;
};
const emp: Employee = {
name: "David",
employeeId: 101
};
interface
可以继承interface
和type
,通过extends
实现。type
可以继承interface
和type
,通过交叉类型&
实现。
三、区别
(1) 可声明的类型
type:不仅可以用来表示对象类型,还可以用来表示基本类型、联合类型、元组和交叉类型。
type userName = string; // 基本类型
type userMsg = string | number; // 联合类型
// 对象类型
type Person = {
name: userName;
age: number;
};
// 使用Person类型
let user: Person = {
name: "leo",
age: 18
};
// 交叉类型 例子:
// 交叉类型将多个类型组合成一个类型,这个类型必须满足所有被组合的类型。对于复杂对象或组合类型的场景非常有用。
type Person = {
name: string;
age: number;
};
type Employee = {
employeeId: number;
position: string;
};
type Developer = Person & Employee; // 交叉类型
const dev: Developer = {
name: "Alice",
age: 28,
employeeId: 123,
position: "Frontend Developer"
};
interface:仅限于描述对象类型和函数
interface User {
name: string;
age: number;
sayHello: () => void;
}
const user1: User = {
name: "Alice",
age: 25,
sayHello: () => console.log("Hello!")
};
(2)interface支持声明合并,type不支持会报错
或者总结成:
- type 可以做到而 interface 不能做到:可以用来表示基本类型、联合类型、元组和交叉类型。
- interface 可以做到而 type 不能做到:interface 可以声明合并。如果使用type,就会报 重复定义 的警告
interface test {
name: string
}
interface test {
age: number
}
/*
test实际为 {
name: string
age: number
}
*/
(3)扩展(继承)的的实现方法
interface是通过extends实现的,type是通过&(交叉类型)实现的。