语法区别
- 对象类型字面量:使用大括号
{}
直接定义,可在变量声明时同时定义类型。例如:
let person: { name: string; age: number } = { name: 'John', age: 30 };
- 接口定义:使用
interface
关键字,以一种独立的、具名的方式定义类型。例如:
interface Person {
name: string;
age: number;
}
let person: Person = { name: 'John', age: 30 };
功能区别
- 对象类型字面量:一般用于一次性的、简单的类型定义,不具备可复用性,在类型合并方面不如接口灵活。比如在函数参数中直接定义:
function greet(person: { name: string; age: number }) {
console.log(`Hello, ${person.name}, you are ${person.age} years old.`);
}
greet({ name: 'Jane', age: 25 });
- 接口定义:更强调可复用性,可通过继承(
extends
)来扩展其他接口,且在类型合并时会自动合并同名接口的成员。例如:
interface Animal {
name: string;
}
interface Dog extends Animal {
breed: string;
}
let myDog: Dog = { name: 'Buddy', breed: 'Golden Retriever' };
使用场景区别
- 对象类型字面量:适用于简单、临时的类型声明,像函数内部的局部变量类型定义,或者只在一处使用的复杂类型。例如:
function processData(data: { value: number; label: string }) {
console.log(`Processing ${data.label} with value ${data.value}`);
}
processData({ value: 42, label: 'Answer' });
- 接口定义:适合需要复用的类型,如模块间共享的对象类型,或者在多个地方用到的复杂数据结构。例如,在一个库中定义通用的数据结构供外部调用:
interface User {
id: number;
username: string;
}
function getUserById(id: number): User {
// 模拟从数据库获取用户数据
return { id, username: 'defaultUser' };
}