接口与类型别名
二者都用于描述对象、函数、构造器等形状;TypeScript 类型系统整体偏结构化(structural):只要结构兼容即可赋值,不要求声明上显式 implements(类 中的 implements 是显式契约文档)。
interface
interface User {
id: string
name: string
tags?: string[] // 可选属性
readonly createdAt: number
}- 声明合并:同一作用域多个同名
interface会合并(适合扩展第三方类型声明)。 extends:继承另一接口;可多继承 交叉需谨慎(同名属性须兼容)。- 可描述 函数与构造器 调用签名。
type 别名
type ID = string | number
type Handler = (ev: Event) => void交叉类型 &
将多个类型「合并」为需同时满足的形状。若同一属性冲突且不相容,会得到 never 属性(常提示设计问题)。
interface 与 type 选型(经验)
| 场景 | 更常用 |
|---|---|
| 对象开放扩展、声明合并 | interface |
| 联合、映射、条件类型、元组别名 | type |
团队可统一风格;一致性比教条重要。
索引签名
interface Dict {
[key: string]: number
}键类型须与 string / number / symbol 兼容;属性具体名与索引返回值类型需满足总体的「一致性」规则。
函数与构造器
- 调用签名:
interface F { (x: number): string } - 构造签名:
new (...args: any[]) => SomeInstance或与abstract new组合(见 类)