SSF0SSF0
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
  • HTML

    • html1
    • html2
  • CSS

    • Flex 布局常见问题与解决方案
  • JavaScript

    • 数据类型及引用问题
    • 处理 Blob 类型文件下载问题总结
    • localStorage 与 sessionStorage 区别
    • JavaScript 中的 script 标签问题详解
    • JavaScript 中的`this`指向问题详解
    • SessionStorage踩坑记录:它真的能"只设置一次"吗?
    • 动态加载 JS 脚本方法对比
    • 浏览器页面关闭场景下的数据上报
  • es6

    • Promise
    • es6 模块导出方式全解析
  • Vue2

    • created VS mounted 发起异步请求
    • vue2-2
  • Vue3

    • Vite + Vue3 修改 element-plus 源码
    • Vue v-if 与 v-show
    • Vue3 ref 获取组件
    • Vue3 路由传参
    • 父子组件与组件里 Hooks 加载顺序
    • 第三方组件传入参数TS提示
    • Vue3 Props 在 Hooks 中的响应性处理
    • Vue Router 的两种历史模式及部署配置详解
    • 在Vue 3项目中顺利集成Tailwind CSS的完整指南
    • Vue 3 深度选择器:deep()完全指南
  • Electron

    • 快速构建 electron + vue3 项目
  • TS

    • TS 泛型
    • 记录模板使用断言的问题
    • type 与 interface
  • WebPack

    • Webpack 介绍
  • Vite

    • Vite CLI 常见命令
    • vite 与 webpack 比较
  • 项目工程

    • 前端代码风格
    • Vue3 项目规范
    • npm 镜像问题
    • 包管理工具
    • 使用 engines 限制开发环境依赖
    • 打包与shell交互指定模式
    • 使用 pnpm 构建 Monorepo 实战指南
    • pnpm 修改依赖源码打包报错
  • 记录一下小程序
  • 控制浏览器正确保存网站账号密码的技巧

type 与 interface

type

type 是 TypeScript 中的一个关键字,用于定义变量、函数参数、函数返回值等的数据类型。它类似于 JavaScript 中的 typeof 操作符,但提供了更强大的功能,可以定义复杂的数据结构。

type Name = string

interface

interface 是 TypeScript 中的另一个关键字,用于定义对象的结构。它类似于 JavaScript 中的对象类型,但提供了更强大的功能,可以定义复杂的数据结构。

interface Name {
  name: string
}

声明合并能力

interface 可以声明合并,而 type 不能声明合并。

interface Name {
  name: string
}

interface Name {
  age: number
}

const name: Name = {
  name: "张三",
  age: 18
}

更好的错误提示

interface 可以提供更好的错误提示,而 type 不能提供更好的错误提示。

interface 在类型检查错误时通常会给出更清晰的错误信息,特别是在处理对象类型时,interface 的错误提示往往更易读。

举例:截图代补充

面向对象设计

interface 更符合面向对象编程的思维方式,在描述组件 props 这种对象结构时,使用 interface 更符合直觉。

interface Props {
  formModel: FormModel
  nextStep: () => void
  enterpriseId: string
  toPath: (path: string) => void
}

这两种写法在功能上没有任何区别。选择 interface 更多是一种编码风格的选择,特别是在 Vue 组件中描述 props 类型时,使用 interface 是一种比较常见的实践。

两者区别

  • 扩展性

    • interface 支持声明合并和扩展(extends),适合用于描述公共接口和大型项目中的接口设计。

    • type 通过交叉类型(&)和联合类型(|)提供更灵活的类型组合方式。

  • 泛型支持

    • interface 支持泛型,适合定义具有可变部分的接口。

      interface GenericInterface<T> {
        value: T
        getValue(): T
      }
    • type 也支持泛型,并且可以定义更复杂的类型,如条件类型和映射类型。

      type GenericType<T> = {
        value: T
        getValue(): T
      }
      
      type StringOrNumber<T> = T extends string | number ? T : never

      type 在泛型方面比 interface 更加灵活,能够处理基本类型、联合类型、条件类型等。

  • 功能覆盖

    • type 可以定义基本类型、联合类型、交叉类型、元组等,而 interface 主要用于定义对象的结构。

      // 联合类型
      type ID = string | number
      
      // 交叉类型
      type Animal = { name: string } & { age: number }
      
      // 元组
      type Point = [number, number]
      // interface 只能定义对象结构
      interface Person {
        name: string
        age: number
      }
  • 使用场景

    • interface 适用于需要定义对象结构并可能需要扩展的场景,如组件的 props。

    • type 适用于需要定义复杂类型组合或对现有类型进行别名的场景,如联合类型和交叉类型。

总结

  • 如果需要定义复杂的数据结构或需要声明合并,建议使用 interface。

  • 如果需要定义基本类型、联合类型、交叉类型、条件类型等,建议使用 type。

  • 在实际开发中,根据具体需求和编码风格选择合适的方式,两者在大多数情况下是可以互换的。

最后更新时间:
贡献者: 何风顺
上一页
记录模板使用断言的问题