TypeScript-入门(四)-接口、类型别名

78 阅读2分钟

一、接口interface

1.1 定义

接口(Interface)是一种用于描述对象的结构的方式,用interface定义。接口定义了对象的属性和方法,但不提供实现。它们用于强制执行一种特定的对象形状。

// 定义对象声明
interface Obj {
    name:string,
    age:number
}
let obj:Obj = {
    name:'张三',
    age:12
}

// 定义函数参数声明
interface N1 {
    (n: number): boolean
}

function getSum(arr: number[], callback: N1) {
    let sum = 0
    arr.forEach(item => {
        if (callback(item)) {
            sum += item
        }
    })
    return sum
}
// 实现偶数相加
const result = getSum([1, 2, 3, 4], (n) => n % 2 === 0)
console.log(result)

1.2 重复声明

interface接口可以重复声明,并进行类型合并,类似于交叉声明

interface N1 {
    name: string
}
interface N1 {
    age: number
}

let n1: N1 = {
    name: '张三',
    age: 121
}

1.3 继承

interface接口可以通过extends进行类型继承

interface N1 {
    name: string
}
interface N2 extends N1 {
    age: number
}

let n1: N2 = {
    name: '张三',
    age: 121
}

1.4 子接口不能覆盖父接口的成员

interface N1 {
    name: string
}

interface N2 extends N1 { // 报错
    name: number
}

image.png

二、类型别名

类型别名(Type Aliases)用于为一个类型定义一个新的名字,用type定义。通过类型别名,你可以更容易地引用复杂的类型结构,提高代码的可读性和可维护性

type Person {
    name:string,
    age:number
}

类型别名不能重复定义,会报错

type T1 = {
    name: string
}
type T1 = {
    age: number
} 

image.png 类型别名可以通过联合声明/交叉声明进行拓展

type T1 = {
    name: string
}
// 交叉声明 将两个类型进行合并
type T2 = {
    age: number
} & T1

// 联合声明,两个类型可以任用一个
type T3 = {
    gender: string
} | T2

let t2: T3 = {
    gender: 'a'
}

三、总结

  • type是给类型定义一个别名,方便使用
    • interface是定义描述一个对象
  • type和interface都可以定义对象类型,但type可以定义基本类型
  • type无法重复定义,会报错,interface可以重复声明,会进行类型合并
    • interface可以重复声明,但重复声明的时候,如果声明了重复的属性,属性类型不能冲突
  • inteface可以通过extends进行继承,type只能通过交叉类型实现类似的继承
    • interface子类型不能覆盖父类型的属性
  • interface可以用于类约束,type不行
  • interface可以继承于类,表示接口要拥有类的成员