类型别名、接口等
类型别名(type)
类型别名:也就是type,用来给一个类型起个新名字
ts
type myType = string | number
type str = string
type obj = { a: string } & { b: number }
let a: myType = 'aa'
let b: myType = 1
let c: str = 'cc'
let d: obj = { a: 'str', b: 132 }
接口(interface)
接口:在面向对象语言中表示行为抽象,也可以用来描述对象的形状。
使用interface关键字来定义接口
对象的形状
接口可以用来描述对象,主要可以包括以下数据:可读属性、只读属性、任意属性
- 可读属性:当我们定义一个接口时,我们的属性可能不需要全都要,这是就需要 ? 来解决
- 只读属性:用 readonly修饰的属性为只读属性,意思是指允许定义,不允许之后进行更改
- 任意属性:这个属性极为重要,它是可以用作就算没有定义,也可以使用,比如 [data: string]: any。比如说我们对组件进行封装,而封装的那个组件并没有导出对应的类型,然而又想让他不报错,这时就可以使用任意属性
ts
interface Info {
id: symbol
username: string
readonly age: number // 只读属性
hobby: string[]
sex?: number // 可选属性
[a: string]: any // 任意类型数据
}
let user: Info = {
id: Symbol('123'),
username: 'ZS',
age: 20,
hobby: [],
xx: 'xx'
}
user.age = 18 // error
继承
继承:与类一样,接口也存在继承属性,也是使用extends字段
ts
interface Info {
id: symbol
username: string
readonly age: number // 只读属性
hobby: string[]
sex?: number // 可选属性
[a: string]: any // 任意类型数据
}
interface User extends Info {
address: string
}
let user: User = {
id: Symbol('123'),
username: 'ZS',
age: 20,
hobby: [],
xx: 'xx',
address: '郑州'
}
user.age = 18 // error
函数类型接口
同时,可以定义函数和类,加new修饰的是类,不加new的是函数
ts
interface fun {
(data: number): number // 定义函数类型
}
let user: fun = (data: number): number => data
class A {
username: string = '123'
constructor(name: string) {
this.username = name
}
}
interface cla {
new (data: string): any // 定义类 类型
}
// 接收类对象类型的数据
let user1 = (func: cla) => new func('123')
console.log(user1(A))
type 和 interface 的区别
通过上面的学习,我们发现类型别名和接口非常相似,可以说在大多数情况下,type与interface是等价的
但在一些特定的场景差距还是比较大的,接下来逐个来看看
基础数据类型
- type和interface都可以定义 对象 和 函数
- type可以定义其他数据类型,如字符串、数字、元祖、联合类型等,而interface不行
扩展
interface 可以扩展 type,type 也可以扩展为 interface,但两者实现扩展的方式不同。
- interface 是通过 extends 来实现
- type 是通过 & 来实现
重复定义
interface 可以多次被定义,并且会进行合并,但type不行