首页 > 其他分享 >TypeScript 中使用type与interface定义类型分别有什么区别?

TypeScript 中使用type与interface定义类型分别有什么区别?

时间:2024-05-15 20:52:49浏览次数:21  
标签:TypeScript string 复用 类型 interface type 定义

在 TypeScript 中,使用 typeinterface 都可以用来定义自定义类型,但它们之间存在一些区别:

  1. 语法:
    • type使用 type 关键字定义类型别名,后跟自定义类型的名称
    • interface 使用 interface 关键字定义接口,后跟自定义类型的名称
  2. 用途:
    • type 主要用于创建类型别名,可以给现有的类型起一个新的名字,包括原始类型、联合类型、交叉类型、函数类型等
    • interface 用于描述对象的形状,包括对象的属性、方法、索引签名等,它更适合用来定义对象的结构
  3. 可拓展性:
    • type 具有更大的灵活性,可以合并多个类型声明,也可以使用交叉类型来组合多个类型
    • interface 可以被继承或者拓展其他接口,可以建立更清晰的接口继承关系
  4. 约束方式:
    • type 通常用于约束某一种类型,比如给一个复杂的联合类型起一个简单易懂的名称
    • interface 通常用于约束对象的结构,可以描述对象的属性和方法

总的来说,typeinterface 在很多情况下可以互相替代,但在某些特定的情况下,选择使用其中一个可能更合适。例如,当你需要描述一个对象的结构时,使用 interface 可能更直观;而当你需要定义一个复杂的类型别名时,使用 type 可能更方便。

 

延申:type 与 interface 两者类型复用时的区别

type定义的类型可以通过交叉类型(&)来进行复用,而interface定义的类型则可以通过继承(extends)来实现复用。值得注意的是,typeinterface定义的类型也可以互相复用。下面是一些简单的示例:

复用type定义的类型:

type Person = {
  name: string;
  age: number;
};

type Student = Person & {
  major: string;
};

复用interface定义的类型:

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

interface Student extends Person {
  major: string;
}

 interface复用type定义的类型:

type Person = {
  name: string;
  age: number;
};

interface Student extends Person {
  major: string;
}

type复用interface定义的类型:

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

type Student = Person & {
  major: string;
};

 

类型部分复用的情况:

比如我们经常在封装组件时,会定义组件的属性props类型,而有的组件props除少部分属性不一样其他属性都一样,这时候我们想复用之前定义的部分属性类型,例如下面这种代码情况

interface Props {
  a: string;
  b: string;
  c: string;
}

interface Props1 {
  a: string;
  b: string;
  d: string;
}

可以利用TypeScript提供的工具类型Omit来高效地实现这种复用。

interface Props {
  a: string;
  b: string;
  c: string;
}

interface Props1 extends Omit<Props, 'c'> {
  d: string;
}

同样,工具类型Pick也可以用于实现此类复用。

interface Props {
  a: string;
  b: string;
  c: string;
}

interface Props1 extends Pick<Props, 'a' | 'b'> {
  d: string;
}

OmitPick分别用于排除和选择类型中的属性,具体使用哪一个取决于具体需求。

 

组件属性定义是使用type还是interface

由于同名接口会自动合并,而同名类型别名会冲突,推荐使用interface定义组件属性。这样,使用者可以通过declare module语句自由扩展组件属性,增强了代码的灵活性和可扩展性。

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

const userInfo: UserInfo = { name: "张三", age: 23 };

 

标签:TypeScript,string,复用,类型,interface,type,定义
From: https://www.cnblogs.com/crazier/p/18193587

相关文章

  • TypeError报错处理
    哈喽,大家好,我是木头左!一、Python中的TypeError简介这个错误通常表示在方法调用时,参数类型不正确,或者在对字符串进行格式化操作时,提供的变量与预期不符。二、错误的源头:字符串格式化的奥秘字符串格式化是Python中一个非常实用的功能,它允许根据一定的格式将变量插入到字符串中......
  • typedef&define
    typedef(1)定义函数别名typedefint(*myfun)(int,int);使用方法:myfuntest_fun;//相当于inttest_fun(int,int);//可以用来声明函数,最常用是在结构体里(2)给变量类型重新定义typedefstruct{inta;intb;}MY_TYPE;typedef与#define的区别(1)#define可以......
  • 错误解决 TypeError: __init__() got an unexpected keyword argument 'size'import l
    TypeError:__init__()gotanunexpectedkeywordargument'size'importlogging代码段如下importloggingimportosfromgensim.modelsimportword2veclogging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s',level=logging.IN......
  • ts中的type 和 interface 区别
    type可以用来给一个类型起个新名字,当命名基本类型或联合类型等非对象类型时非常有用,而接口不行typeMyNumber=number;typeStringOrNumber=string|number;typeText=string|string[];2类型别名通过&(交叉运算符)来扩展,而接口通过extends的方式来扩展。都可以......
  • How to Solve VAS 6154 Interface License Expired: Unleash Your Automotive Diagnos
    WelcometoourcomprehensiveguideonresolvingtheVAS6154InterfaceLicenseExpiredissue.Ifyou'reanautomotiveenthusiastorprofessional,chancesareyou'veencounteredthisfrustratingproblemduringyourdiagnosticendeavors.Butfret......
  • 3-DOCTYPE和lang以及字符集的作用
    在开发工具中创建文件时会自动生成骨架结构并附带一些常用设置,例如:点击查看代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0">......
  • TypeScript 中,type 和 interface 定义自定义类型的区别
    在TypeScript中,type 和 interface 都用于定义自定义类型,但它们有一些不同之处。主要区别在于以下几点:语法差异:type:使用 type 关键字来定义类型别名,语法相对简洁,适合用于定义具体的类型结构或组合现有类型。interface:使用 interface 关键字来定义接口,语法更为正式,可......
  • TypeScript 的联合类型、交叉类型、映射类型
    当使用TypeScript时,联合类型、交叉类型和映射类型是常见的高级类型概念,它们提供了强大的工具来处理各种复杂的类型情况。###联合类型(UnionTypes):联合类型允许一个值属于多个类型之一。使用`|`符号来表示联合类型。例如:```typescriptletvalue:string|number;value="......
  • TypeScript 中,元组(Tuple)
    在TypeScript中,元组(Tuple)是一种特殊的数据结构,它允许你表示一个固定长度的、类型确定的数组。与普通的数组不同,元组中的每个位置可以拥有不同的数据类型。元组的定义方式是将多个类型用逗号分隔,然后用方括号 [] 将它们括起来。例如:letmyTuple:[string,number,boolean];......
  • TypeScript 枚举类型(enum),声明常量
    enumErrorShowType{ SILENT=0, WARN_MESSAGE=1, ERROR_MESSAGE=2, NOTIFICATION=3, REDIRECT=9,} 这是一个枚举类型(enum)的定义,名为ErrorShowType。枚举类型是一种数据类型,它允许你定义一组命名的常量值。在这个例子中,ErrorShowType枚举类型包含......