在 TypeScript 中,使用 type
和 interface
都可以用来定义自定义类型,但它们之间存在一些区别:
- 语法:
type
使用type
关键字定义类型别名,后跟自定义类型的名称interface
使用interface
关键字定义接口,后跟自定义类型的名称
- 用途:
type
主要用于创建类型别名,可以给现有的类型起一个新的名字,包括原始类型、联合类型、交叉类型、函数类型等interface
用于描述对象的形状,包括对象的属性、方法、索引签名等,它更适合用来定义对象的结构
- 可拓展性:
type
具有更大的灵活性,可以合并多个类型声明,也可以使用交叉类型来组合多个类型interface
可以被继承或者拓展其他接口,可以建立更清晰的接口继承关系
- 约束方式:
type
通常用于约束某一种类型,比如给一个复杂的联合类型起一个简单易懂的名称interface
通常用于约束对象的结构,可以描述对象的属性和方法
总的来说,type
与 interface
在很多情况下可以互相替代,但在某些特定的情况下,选择使用其中一个可能更合适。例如,当你需要描述一个对象的结构时,使用 interface
可能更直观;而当你需要定义一个复杂的类型别名时,使用 type
可能更方便。
延申:type
与 interface
两者类型复用时的区别
type
定义的类型可以通过交叉类型(&
)来进行复用,而interface
定义的类型则可以通过继承(extends
)来实现复用。值得注意的是,type
和interface
定义的类型也可以互相复用。下面是一些简单的示例:
复用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; }
Omit
和Pick
分别用于排除和选择类型中的属性,具体使用哪一个取决于具体需求。
组件属性定义是使用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