MST

星途 面试题库

面试题:TypeScript 中 type 与 interface 在定义对象类型时的主要区别

请阐述在 TypeScript 里,使用 type 与 interface 定义对象类型时,在语法、功能等方面有哪些主要区别,并各举一个简单示例。
10.6万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

语法区别

  1. type:使用 type 关键字定义类型别名,语法为 type 类型别名 = 类型定义
    type UserType = {
        name: string;
        age: number;
    };
    
  2. interface:使用 interface 关键字定义接口,语法为 interface 接口名 { 成员定义 }
    interface UserInterface {
        name: string;
        age: number;
    }
    

功能区别

  1. 合并声明
    • interface:支持合并声明,多个同名 interface 声明会自动合并成一个接口。
    interface User {
        name: string;
    }
    interface User {
        age: number;
    }
    let user: User = { name: 'John', age: 30 };
    
    • typetype 类型别名不能重复定义,重复定义会报错。
  2. 类型运算
    • type:支持类型运算,如联合类型、交叉类型等。
    type StringOrNumber = string | number;
    type CombineTypes = { name: string } & { age: number };
    
    • interface:不支持直接进行类型运算,但可以通过其他方式间接实现类似功能,如使用 extends 关键字扩展接口。
  3. 实现继承
    • interface:接口可以通过 extends 关键字继承其他接口,实现接口的复用和扩展。
    interface Animal {
        name: string;
    }
    interface Dog extends Animal {
        breed: string;
    }
    
    • type:类型别名可以通过交叉类型来模拟继承,但语法上和接口继承有所不同。
    type AnimalType = {
        name: string;
    };
    type DogType = AnimalType & {
        breed: string;
    };
    
  4. 可索引类型
    • interface:可以方便地定义可索引类型。
    interface StringDictionary {
        [key: string]: string;
    }
    let dict: StringDictionary = { key1: 'value1' };
    
    • type:也能定义可索引类型,但语法稍显不同。
    type StringDictionaryType = {
        [key: string]: string;
    };
    let dictType: StringDictionaryType = { key1: 'value1' };