一、基本类型与类型注解
-
原始类型
string,number,boolean,null,undefined,symbol,bigint -
数组与元组
number[]或Array<number>
元组:[string, number]固定长度与类型 -
any / unknown / never / void
any:关闭类型检查,尽量避免。unknown:安全的“任意类型”,需类型守卫后才能使用。never:永不返回的函数(抛出错误或无限循环)或不可能存在的类型。void:无返回值的函数。
-
对象类型
{ name: string; age?: number }可选属性,只读属性readonly -
函数类型:
function: 表示函数类型。void: 表示函数没有返回值。any: 表示任意类型。
二、接口与类型别名
-
接口
interface
定义对象结构,可扩展(extends),可重复声明(合并),interface用extends扩展 -
类型别名
type
可定义联合类型、元组、原始类型别名等,不可重复声明,type用交叉&扩展 -
区别与使用场景
- 对象结构优先用
interface,需要联合/交叉/映射类型时用type
- 对象结构优先用
三、高级类型
- 联合类型
|与 交叉类型&
string | number,A & B同时满足 - 字面量类型
type Direction = 'up' | 'down' - 类型守卫
typeof、instanceof、自定义类型谓词is - 类型断言
as或<>,非空断言! - 索引签名
[key: string]: any - 映射类型
Partial<T>、Required<T>、Readonly<T>、Pick<T, K>、Omit<T, K>、Record<K, T>等 - 条件类型
T extends U ? X : Y,infer关键字
四、类与面向对象
- 类成员
public(默认)、private、protected、readonly - 抽象类与抽象方法
abstract class,不能被实例化 - 类作为类型
类同时创建值空间和类型空间 - 实现接口
implements - 参数属性
构造函数中直接声明constructor(public name: string) {}
五、泛型
泛型是一种在定义函数、类或接口时使用类型参数的方式,以增加代码的灵活性和重用性。在TypeScript中,可以使用来创建泛型
- 泛型函数
function identity<T>(arg: T): T - 泛型接口与类
interface Box<T> { value: T } - 泛型约束
T extends Lengthwise - 泛型默认类型
T = string
六、模块与命名空间
- ES 模块
import/export - 命名空间
namespace
内部模块,常用于声明文件(.d.ts),避免全局污染
七、枚举(enum)
枚举是一种对数字值集合进行命名的方式。它们可以增加代码的可读性,并提供一种便捷的方式来使用一组有意义的常量。例如:
enum Color {
Red,
Green,
Blue
}
let selectedColor: Color = Color.Red;
枚举和常量枚举的区别:
枚举可以包含计算得出的值,而常量枚举则在编译阶段被删除,并且不能包含计算得出的值,它只能包含常量成员。常量枚举在编译后会被删除,而普通枚举会生成真实的对象。
、声明文件
.d.ts文件用于描述已有 JS 库的类型declare关键字- 三斜线指令
/// <reference types="..." />
常见面试题
any、unknown、never、void 的区别?
-
any:放弃类型检查,任何操作都允许,应尽量避免。 -
unknown:表示“未知类型”,必须先通过类型守卫(如typeof、instanceof)才能使用其上的操作。 -
never:表示永不存在的值,常用于抛出异常、无限循环的函数返回类型,或条件类型中不可达的分支。 -
void:表示函数没有返回值(或返回undefined)。
泛型的作用?泛型约束如何实现?
- 泛型允许定义“类型参数”,使组件可复用,同时保留类型安全。
- 泛型约束通过
extends实现,如function logLength<T extends { length: number }>(arg: T): T,限制传入类型必须包含length属性。