当前位置: 首页 > article >正文

ts中 type 和 interface 定义类型有什么区别?

type

定义基本类型别名:

  • type 可以定义基本的类型别名,例如:

    typescript

    type Name = string;
    type Age = number;
    

联合类型和交叉类型:

  • type 支持创建联合类型和交叉类型,这在一些复杂的类型定义中非常有用。

    typescript

    type Status = 'success' | 'error' | 'loading';
    type UserResponse = { userId: string; userName: string } & { status: Status };
    

高级类型特性:

  • type 可以用来定义条件类型、映射类型等更高级的类型特性。

    typescript

    type MessageOf<T> = T extends { message: infer M } ? M : never;
    type Properties<T> = { [K in keyof T]: T[K] };
    

缺点:

  • type 无法进行声明合并。

  • type 不支持扩展(继承)其他类型。

interface

定义对象类型:

  • interface 主要用于定义对象的结构。

    typescript

    interface Person {
        name: string;
        age: number;
    }
    

扩展(继承):

  • interface 可以使用 extends 关键字扩展其他接口,这在需要继承多个对象结构时非常有用。

    typescript

    interface Employee extends Person {
        employeeId: number;
    }
    

声明合并:

  • interface 支持声明合并,即同名接口会自动合并所有声明的属性。

    typescript

    interface Person {
        address: string;
    }
    interface Person {
        phone: string;
    }
    // 合并后的 Person 接口包含 name, age, address, phone 属性
    

缺点:

  • interface 不支持联合类型和交叉类型。

  • interface 在高级类型特性上不如 type 灵活。

使用场景

何时使用 type:

  • 需要定义基本类型别名、联合类型或交叉类型时。

    typescript

    type ID = string | number;
    type User = { name: string; age: number } & { id: ID };
    
  • 需要使用高级类型特性时,例如条件类型和映射类型。

    typescript

    type ReadOnly<T> = { readonly [P in keyof T]: T[P] };
    

何时使用 interface:

  • 主要定义对象类型,并且希望利用继承特性时。

    typescript

    interface Car {
        make: string;
        model: string;
    }
    interface ElectricCar extends Car {
        batteryLife: number;
    }
    
  • 需要声明合并时,可以更方便地扩展类型。

    typescript

    interface User {
        name: string;
        age: number;
    }
    interface User {
        email: string;
    }
    // 合并后的 User 接口包含 name, age, email 属性
    

总结来说,type 更适合于定义复杂类型、联合类型和交叉类型,而 interface 更适合于定义对象类型并利用其继承和声明合并的特性。


http://www.kler.cn/a/466504.html

相关文章:

  • 微信小程序Uniapp
  • GPT分区 使用parted标准分区划分,以及相邻分区扩容
  • Ae:合成设置 - 3D 渲染器
  • Java虚拟机(Java Virtual Machine,JVM)
  • redis源码系列--(四)--redis cluster
  • 开源存储详解-分布式存储与ceph
  • 【Unity】【图形渲染】Unity Shader基础操作3:内置文件与包含文件的使用
  • 实时数仓与离线数仓的全面对比
  • 上升沿下降沿递增
  • 高等数学学习笔记 ☞ 函数的极限
  • 微信小程序滑动解锁、滑动验证
  • git 退出编辑模式
  • AI对嵌入式开发行业的影响
  • 家政上门小程序如何创建?家政服务怎么能少了小程序帮手
  • Unity 对Sprite或者UI使用模板测试扣洞
  • 安装并配置Ubuntu22.04桌面
  • 【Python系列】处理空请求体Body
  • 中间件自动化测试框架cmdlinker
  • SQL 中复杂 CASE WHEN 嵌套逻辑优化
  • ros2 笔记-1.1 体验C++编译
  • Deepseek v3 的笔记
  • 如何使用OpenCV进行抓图-多线程
  • 基于AI边缘计算盒子的智慧零售场景智能监控解决方案
  • (NIPS-2023)ProlificDreamer:通过变分分数蒸馏实现高保真、多样化的文本到 3D 生成
  • 电子电气架构 --- 中央处理器HPC及软件架构
  • 创龙3588——debian根文件系统制作