1. TypeScript 类型定义的双生子:interface 与 type 的本质差异
在 TypeScript 项目中,interface 和 type 就像是一对性格迥异的双胞胎。表面上看它们都能用来定义对象结构,但实际开发中你会发现老手们会根据不同场景灵活选择。这就像木匠选择工具——虽然锤子和扳手都能敲钉子,但专业选手知道什么时候该用什么。
先看个典型例子:假设我们要定义用户对象。用 interface 可以这样写:
typescript复制interface User {
id: number
name: string
email?: string
}
用 type 则写成:
typescript复制type User = {
id: number
name: string
email?: string
}
此时两者功能几乎完全一致,但它们的基因决定了不同的适应场景。理解这些差异,你就能写出更符合 TypeScript 设计哲学的代码。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心特性对比与适用场景
2.1 扩展性:interface 的声明合并特性
interface 有个独门绝技——声明合并。当重复声明同名接口时,TypeScript 会自动合并属性。这在扩展第三方库类型时特别有用:
typescript复制// 原始定义
interface Window {
title: string
}
// 后续扩展
interface Window {
ts: TypeScriptAPI
}
// 结果会自动合并为:
// interface Window {
// title: string
// ts: TypeScriptAPI
// }
而 type 不允许重复定义,会直接报错。这个特性让 interface 成为定义公共库类型的首选,比如 React 的组件 Props 就普遍采用 interface。
经验法则:当需要对外暴露可扩展的类型时,优先选择 interface
2.2 灵活性:type 的联合与映射能力
type 在组合类型方面更胜一筹,特别是使用联合类型(|)和映射类型时:
typescript复制// 联合类型
type Us
