首页 > 其他分享 >类型和接口之间的区别

类型和接口之间的区别

时间:2023-05-26 15:12:10浏览次数:27  
标签:string 区别 number 接口 boolean 类型 type

摘抄自《TypeScript编程》Boris Cherny著 安道译

1. 类型和接口的共同点

与类型别名相似,接口是一种命名类型的方式,这样就不用在行内定义了。类型别名和接口算是同一概念的两种语法(就像函数表达式和函数声明之间的关系),不过二者之间还是有一些细微差别。先看二者的共同点。以下述类型别名为例:

在使用Sushi类型别名的地方都能使用Sushi接口。两个声明都定义结构,而且二者可以相互赋值(其实,二者完全一样)。

// 类型
type Sushi = {
    calories: number,
    salty: boolean,
    tasty: boolean
}

// 接口
interface Sushi {
    calories: number,
    salty: boolean,
    tasty: boolean
}

把类型组合在一起时,更为有趣。下面为Sushi之外的另一个食物建模:

type Sushi = {
    calories: number,
    salty: boolean,
    tasty: boolean
}

type Cake = {
    calories: number,
    sweet: boolean,
    tasty: boolean
}

// 类型组合
type Food = {
    calories: number,
    tasty: boolean
}
type Sushi = Food & {
    salty: boolean
}
type Cake = Food & {
    sweet: boolean
}

// 接口定义
interface Food {
    calories: number,
    tasty: boolean
}
interface Sushi extends Food {
    salty: boolean
}
interface Cake extends Food {
    sweet: boolean
}

2. 类型和接口的细微差别

1)类型别名更为通用,右边可以是任何类型,包括类型表达式(类型,外加&或|等类型运算符);而在接口声明中,右边必须为结构。例如,下述类型别名不能使用接口重写:

type A = number;
type B = A | string;

2)扩展接口时,TypeScript将检查扩展的接口是否可赋值给被扩展的接口。而使用交集类型时则不会出现这种问题。如果把下例中的接口换成类型别名,把extends换成交集运算符(&),TypeScript将尽自己所能,把扩展和被扩展的类型组合在一起,最终的结果是重载bad的签名,而不会抛出编译时错误。建模对象类型的继承时,TypeScript对接口所做的可赋值性检查是捕获错误的有力工具。

interface A {
    good(x: number): string,
    bad(x: number): string
}

/**
 * Interface 'B' incorrectly extends interface 'A'.
    Types of property 'bad' are incompatible.
    Type '(x: string) => string' is not assignable to type '(x: number) => string'.
        Types of parameters 'x' and 'x' are incompatible.
        Type 'number' is not assignable to type 'string'.ts(2430)
 */
interface B extends A {
    good(x: string | number): string,
    bad(x: string): string
}

3)第三个区别是,同一作用域中的多个同名接口将自动合并;同一作用域中的多个同名类型别名将导致编译时错误。这个特性称为声明合并。

标签:string,区别,number,接口,boolean,类型,type
From: https://www.cnblogs.com/ran2022/p/17434809.html

相关文章

  • Shopee|Lazada电商平台api接口,接入获取商品评论|根据关键词取商品列表API说明示例
     Shopee和Lazada是东南亚地区广受欢迎的电商平台。它们的模式非常类似,都是以C2C(消费者到消费者)、B2C(企业到消费者)和O2O(线上到线下)为主要销售模式。用户可以在平台上购买商品或者将自己的商品出售给其他用户。这些平台提供了较高的使用便利性,比如支持多种支付方式、商品搜索......
  • spring中的beanFactory和FactoryBean的区别?
    beanFactory是容器的根接口是一个工厂,负责管理bean,创建bean。FactoryBean是一个工厂bean,用来创建一类比较复杂的对象。比如mybatis里的sqlsessionFactory。二者的联系:FactoryBean的实现类会向容器中注入自身以及getObject方法返回的对象。二者联系的点在于AbstractBeanFac......
  • mysql表类型和存储引擎和视图
    1. mysql表类型和存储引擎  8031.1 基本介绍1. MySQL的表类型由存储引擎(Storage Engines)决定,主要包括MyISAM、innoDB、Memory等。2. MySQL数据表主要支持六种类型,分别是: CSV、 Memory、ARCHIVE、MRG_MYISAM、MYISAM、 InnoBDB.3.这六种又分为两类,一类是”事务安全型”......
  • 系统工程(九)电子政务类型
    电子政务主要有3种角色,政府G,企事业单位B,公民C。它们之间的关联有 政府-企事业单位G2B企事业单位-政府B2G政府-公民 G2C公民-政府C2G判断哪个类型的关键是以发起业务的角色为开头特别注意的是还有角色E就是雇员 政府中的雇员是 G2E  或者E2G ......
  • FLEX实践—控件内容与String显示区别
     在解释这个区别之前先来看一段示例:<?xmlversion="1.0"encoding="utf-8"?><mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"layout="absolute"><mx:Script><!--[CDATA[i......
  • 数据类型
    publicclassdemoo{publicstaticvoidmain(String[]args){Stringa="hello";intnum=10;System.out.println(a);System.out.println(num);//八大数据基本类型一字节(byte)=八位(bit)//整数,int最常用intnum1......
  • 深度学习进阶篇-预训练模型[3]:XLNet、BERT、GPT,ELMO的区别优缺点,模型框架、一些Trick
    深度学习进阶篇-预训练模型[3]:XLNet、BERT、GPT,ELMO的区别优缺点,模型框架、一些Trick、TransformerEncoder等原理详细讲解1.XLNet:GeneralizedAutoregressivePretrainingforLanguageUnderstanding1.1.从AR和AE模型到XLNet模型自回归模型(AutoregressiveModel,AR),通过估计......
  • 八大基本数据类型
    publicclassdemoo{publicstaticvoidmain(String[]args){Stringa="hello";intnum=10;System.out.println(a);System.out.println(num);//八大数据基本类型一字节(byte)=八位(bit)//整数,int最常用intnum1......
  • SpeingBoot集成Redis和Redis的五种类型数据
    目录Springboot集成redisredis-cli的一些小知识点Springboot集成redismaven配置:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>配置redisTemplate,因为只操作字符串......
  • "深入理解拼多多API接口:给予更多选择"
     拼多多是一个国内非常受欢迎的电商平台,为了给开发者提供更好的服务,拼多多提供了API接口。通过API接口,开发者可以访问拼多多的数据和服务,为用户构建更加完善的应用程序。下面我们来了解一下拼多多API接口的基本概念、使用方法以及一些开发者需要注意的问题。一、API接口的基本概念......