面试题答案
一键面试声明方式
- 接口(interface):使用
interface
关键字声明。例如:
interface User {
name: string;
age: number;
}
- 类型别名(type alias):使用
type
关键字声明。例如:
type User = {
name: string;
age: number;
};
类型别名还可以用于其他类型,如联合类型、交叉类型等。例如:
type StringOrNumber = string | number;
type UserInfo = { name: string } & { age: number };
扩展方式
- 接口(interface):通过
extends
关键字扩展。例如:
interface Employee extends User {
jobTitle: string;
}
接口可以多继承,即一个接口可以继承多个接口。例如:
interface A { a: string; }
interface B { b: number; }
interface C extends A, B { c: boolean; }
- 类型别名(type alias):对于对象类型,使用交叉类型
&
来实现类似扩展效果。例如:
type Employee = User & {
jobTitle: string;
};
但类型别名不能像接口那样多继承,交叉类型组合多个类型时,若有同名属性且类型不一致会报错。
使用场景
- 接口(interface):
- 主要用于定义对象的形状,在面向对象编程风格中,当需要描述类的公共结构,或者定义可重用的对象类型结构时很有用,比如定义 API 数据返回格式。
- 当需要对同一个接口进行多次声明合并时,接口更合适。例如:
interface User {
name: string;
}
interface User {
age: number;
}
// 此时 User 接口有 name 和 age 属性
- 类型别名(type alias):
- 适用于定义联合类型、交叉类型以及对原始类型进行别名定义。比如定义函数参数可能接受多种类型时使用联合类型别名很方便。
- 对于一些复杂类型,特别是涉及到函数类型的别名定义,类型别名更为简洁。例如:
type CompareFunction = (a: number, b: number) => number;