On this page
对象类型定义方式对比
如何通过interface和type分别定义包含name属性和age属性的对象类型?在可选属性、只读属性定义语法上两者有何异同?
考察点分析
该题目主要考察以下核心能力维度:
- TypeScript类型系统理解:对类型定义基础语法的掌握程度
- 类型工具辨析能力:区分interface和type在不同场景下的适用性
- 细节特性把控:可选属性和只读属性等高级类型特性的正确使用
具体评估点包括:
- 对象类型声明语法差异
- 可选属性(Optional Properties)定义规范
- 只读属性(Readonly Modifier)实现方式
- interface声明合并特性认知
- type扩展联合类型能力
技术解析
关键知识点
Interface基本类型声明 > Type类型别名声明 > 声明合并特性 > 扩展能力差异
1. 基础定义
// Interface方式
interface Person {
name: string
age: number
}
// Type方式
type Person = {
name: string
age: number
}
2. 可选属性
两者均使用?:
语法:
interface Person {
name: string
age?: number // 可选属性
}
type Person = {
name: string
age?: number
}
3. 只读属性
均使用readonly
修饰符:
interface Person {
readonly id: number
name: string
}
type Person = {
readonly id: number
name: string
}
常见误区
- 错误认为interface和type语法存在本质差异(实际在对象类型定义时语法一致)
- 混淆类型扩展方式(interface用extends,type用交叉类型)
- 过度使用type定义对象类型(不符合TS官方推荐规范)
问题解答
通过interface和type定义包含name和age属性的对象类型语法完全一致,两者在可选属性和只读属性的定义语法上也没有差异。主要区别体现在类型系统的其他特性中:
相同点:
- 对象结构定义语法相同
- 均支持
?:
声明可选属性 - 均支持
readonly
修饰符
核心差异:
- interface支持声明合并,重复声明会自动合并
- type可定义联合类型、元组等复杂类型
- 官方推荐interface定义对象类型,type用于类型别名
// 声明合并示例
interface User { name: string }
interface User { age: number }
// 最终合并为 { name: string; age: number }
// Type无法重复声明
type User = { name: string }
type User = { age: number } // 报错
深度追问
- 何时应该优先使用interface?
需要声明合并或定义对象类型时
- type如何实现继承?
使用交叉类型:type Admin = Person & { permissions: string[] }
- readonly与const的区别?
const处理变量,readonly处理属性
Last updated 06 Mar 2025, 13:07 +0800 .