type 与 interface

news2024/11/24 15:30:13

type 与 interface

官方文档是这么说的:

For the most part, you can choose based on personal preference, and TypeScript will tell you if it needs something to be the other kind of declaration. If you would like a heuristic, use interface until you need to use features from type.

大多数情况下,你可以根据个人偏好进行选择,TS 会告诉你是否它是否需要额外的信息去改成另一个声明。如果你想要一个启发式:

使用 interface 一直到你需要使用 type 的一些特性。

所以,如果不是项目有额外的规范的话,一般情况下可以使用 inrerface 就够了。

type

一个 type alias 的定义就是:一个任何类型的名字 (a name for any type),其语法如下:

type Point = {
  x: number;
  y: number;
};

// Exactly the same as the earlier example
function printCoord(pt: Point) {
  console.log("The coordinate's x value is " + pt.x);
  console.log("The coordinate's y value is " + pt.y);
}

printCoord({ x: 100, y: 100 });

除了基础的使用之外,type 还有这几个 interface 不具备的特性:

  1. 可声明基础型

    type primitiveType = string;
    

    而 interface 因为语法问题,当其被进行声明时,已经是一个对象结构。

    同理可推,type 也可以用来声明 tuple——毕竟 tuple 从结构上来说不是一个对象。

  2. 可声明 union 类型

    type type1 = {
      x: number;
    };
    type type2 = {
      y: number;
    };
    
    type unionType = type1 | type2;
    

    这时对 unionType 的断言为 {x: 1} 或是 {y:1.11},如出现其他的类型则会报错:

    在这里插入图片描述

    其实这样的功能对于 primitive 的生命比较有用,interface 也可以使用 optional 选项进行实现。

  3. 可以用计算式

    这是在看另一个项目组的项目时碰到的写法,当时第一个感觉就是……woc 牛逼啊,可太省事情了:

    在这里插入图片描述

    可惜 interface 没法使用这个操作。

  4. 创建后无法被修改

    也就比较像是 Object.freeze() 这种实现吧。

    type Window = {
      title: string;
    };
    
    type Window = {
      ts: TypeScriptAPI;
    };
    
    // Error: Duplicate identifier 'Window'.
    

除此之外,type 的扩展方式使用 & 符号,如:

type Animal = {
  name: string;
};

type Bear = Animal & {
  honey: boolean;
};

const bear = getBear();
bear.name;
bear.honey;

interface

一个 nterface declaration 的定义就是:另一个命名对象类型的方式 (another way to name an object type),其语法如下:

interface Point {
  x: number;
  y: number;
}

function printCoord(pt: Point) {
  console.log("The coordinate's x value is " + pt.x);
  console.log("The coordinate's y value is " + pt.y);
}

printCoord({ x: 100, y: 100 });

可以看到,和使用 type 没什么特别大的区别,这也就是 TS 官方说,先用 interface,遇到 interface 没法满足的功能再使用 type 的原因。

interface 的扩展方式如下:

interface Animal {
  name: string;
}

interface Bear extends Animal {
  honey: boolean;
}

const bear = getBear();
bear.name;
bear.honey;

与 type 的对比就是,interface 更加的动态,也就是说如果新建一个变量名相同的 interface,TS 会自动对其进行扩展,如:

interface Window {
  title: string;
}

interface Window {
  ts: TypeScriptAPI;
}

const src = 'const a = "Hello World"';
window.ts.transpileModule(src, {});

总结

TS 的官方推荐是一直使用 interface 一直到 interface 无法满足对 type 的需求,个人看别的项目的感觉是,对于大部分的 data definition(不可变的数据类型,需要传进对象的参数)应该使用 type,其他的情况可以使用 interface。

另外 TS 中的实现还挺乱的,比如说彼此扩展这种事情都是可以实现的:

在这里插入图片描述

所以规范化的执行是最重要的事情。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/84499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于C#+SQL Server2008实现(WinForm)学生宿舍管理系统【100010029】

1 概述 本次课程设计是数据库课程设计,我选的是学生宿舍管理系统,功能块主要是宿舍管理、学生管理、出入登记和来访登记,目的在于将学生宿舍的管理实现信息化,监控学生宿舍的情况防止意外发生。 课程设计任务的需求分析 2.1设计…

01算法的概念

开始系统学习算法啦!为后面力扣和蓝桥杯的刷题做准备!这个专栏将记录自己学习算法是的笔记,包括概念,算法运行过程,以及代码实现,希望能给大家带来帮助,感兴趣的小伙伴欢迎评论区留言或者私信博…

Day828.多线程原语:管程 -Java 并发编程实战

多线程原语:管程 Hi,我是阿昌,今天学习记录的是关于多线程原语:管程的内容。 并发编程这个技术领域已经发展了半个世纪了,相关的理论和技术纷繁复杂。 那有没有一种核心技术可以很方便地解决的并发问题呢&#xff1…

JAVA毕业设计——基于SpringBoot的健身房管理系统(源代码+数据库)

github代码地址 https://github.com/ynwynw/gym-public 毕业设计所有选题地址 https://github.com/ynwynw/allProject 基于SpringBoot的健身房管理系统(源代码数据库) 一、系统介绍 系统层次结构图如下: 管理员登录模块会员管理模块教练管理模块课程管理模块器材…

基于Java+SQL Server2000实现(界面)学生选课管理系统【100010025】

学生选课管理系统 二、需求描述 本系统是一个单机版的小型的学生选课管理系统,在本系统中,开发了一个面向管理员、学生和教师这三个对象的教务平台,对学生提供的服务有登录、选课、、修改登录密码、和查询成绩这几个服务,所选课…

第二季5:配置视频捕获(step3:VI部分)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 前言 本文将详细介绍博文第二季3:sample_venc.c的整体分析提及的“配置视频捕获”。 该部分主要涉及以下步骤: 5、配置MIPI6、初始化ISP7、运行ISP线程8、配置开启VI 设备捕…

Mybatis 参数处理器注入配置解析流程

参数处理器的作用 Mybatis作为一个ORM框架, 其最原始的本质就是JDBC,对于JDBC的使用步骤中有2步和参数处理器有关, 就是给预处理器PreparedStatement 设置参数以及通过结果集获取字段值。 这两个步骤在Mybatis中已经成为框架底层逻辑流程&am…

【K8S系列】第十一讲:包管理神器-Helm

目录 序言 1.背景介绍 1.1 k8s 简单介绍 1.2 k8s部署挑战 2.Helm 2.1 Helm介绍 2.1 使用优势: 3.Helm模块 3.1 Helm 3.1.1 安装Helm 3.2 Chart 3.2.1 Chart 基本介绍 3.2.2 Chart目录结构 3.3 Repoistory 3.4 Config 3.5 Release 4.投票 序言 当…

Windows及Linux系统查找某个端口和文件被占用

概述 开发中很常见的问题,每次遇到这个问题,都是去Google搜索,不一定能搜到满意的答案,有点耗时,故记录一下,得到本文。 端口被占用,导致IDEA启动应用失败。又或者某个文件被某个未知的应用使…

c#入门-抽象类

抽象类 有些类存在的意义就是为了让别的类继承。自己本身不应该具有实例。例如 class 单位 {public int 生命; } class 建筑 : 单位 {public int 护甲; } class 英雄 : 单位 {public int 护盾; } class 小兵 : 单位 {public int 经验; }可以使用abstract把他声明为抽象类。 抽…

Linux查找find命令全面剖析

Linux查找find命令全面剖析 1. 文件查找 在文件系统上查找符合条件的文件 1.1 简述 locate 命令 非实时查找(数据库查找) 依赖于事先构建的索引,索引的构建是在系统较为空闲时自动进行(周期性任务) 手动更新数据库(updatedb),索引构建过程需要遍历整…

【物理应用】基于Matlab模拟13自由度摩托车模型

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

Python使用Selenium WebDriver的入门介绍及安装教程

Selenium WebDriver 入门一、什么是Selenium WebDriver二、安装Selenium WebDriver2.1 安装selenium类库2.2 安装浏览器驱动2.3 配置环境变量三、编写第一个Selenium脚本一、什么是Selenium WebDriver WebDriver 以本地化方式驱动浏览器,就像用户在本地或使用 Sele…

[附源码]Nodejs计算机毕业设计基于Java网上玩具商店Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

R语言基于协方差的SEM结构方程模型中的拟合指数

在实践中, 因子负载较低(或测量质量较差)的模型的拟合指数要好于因子负载较高的模型。 最近我们被客户要求撰写关于SEM的研究报告,包括一些图形和统计输出。例如,如果两个模型具有相同的错误指定级别,并且…

漫游Linux块IO

前言 在计算机的世界里,我们可以将业务进行抽象简化为两种场景——计算密集型和IO密集型。这两种场景下的表现,决定这一个计算机系统的能力。数据库作为一个典型的基础软件,它的所有业务逻辑同样可以抽象为这两种场景的混合。因此&#xff0…

云原生时代数据库运维体系演进

作者:vivo 互联网服务器团队- Deng Song 本文根据邓松老师在“2022 vivo开发者大会"现场演讲内容整理而成。 数据库运维面临着大规模数据库实例难以有效运维、数据库难以做好资源弹性伸缩以及个人隐私数据安全难以保障这三个方面的挑战。对此,vivo给…

redis之事务分析

写在前面 本文一起看下redis提供的事务功能。 1:事务的ACID A(Atomic)原子性,C(Consitency)一致性,I(Isolation)隔离性,D(Durability)持久性,其…

kubernetes学习之路--BadPods(Part1)

摘要:对Pod配置进行实战学习,以BadPods项目为例学习危险配置。 目录 一.BadPods介绍及使用 二.BadPods配置学习 2.1 less1--Everything allowed 基本操作学习 2.2 less1--Everything allowed 渗透学习 一.BadPods介绍及使用 项目地址:h…

西门子KTP1200触摸屏右上角出现黄色感叹号_报警指示器的组态与应用

西门子KTP1200触摸屏右上角出现黄色感叹号_报警指示器的组态与应用 设备运行时产生报警时通常会在画面右上角有个指示器在闪烁提示报警产生。 本次和大家分享报警指示器的组态和具体使用方法。 报警指示器的组态。 报警指示器使用警告三角来表示报警处于未决状态或要求确认。如…