# TypeScript 接口

# 1. 接口定义

// 定义一个接口
// 其实类似于 Go 中的 struct:描述一个 object 应该有的 property 和 method
// 与 Java、C 中的 interface 并不是同一个概念
interface Employee {
    readonly name: string           // readonly
    salary: number
    bonus?: number                  // optional
}

// 不可少字段
// 不可多字段
// bonus 为可选
const emp1:Employee = {
    name: 'hedon',
    salary: 2000
}

const emp2: Employee = {
    name: 'hedon',
    salary: 2000,
    bonus: 1000,
}

// let emp3: Employee
// console.log(emp3)   // 不可,还没分配空间
// emp3.name = '111'   // 不可,还没分配控制

# 2. 可选字段串联

  • ?: 可选
  • !: 确保有,后果自负
interface Employee {
    name?: {
        first: string
        last: string
    }  
    salary: number
    bonus?: number                 
}


function hasBadName(e: Employee){
    return e.name?.first.startsWith('AAA')
}

const emp1: Employee = {
    name: {
        first: 'hedon',
        last: 'wang'
    },
    salary: 2222,
    bonus: 2000
}

console.log(hasBadName(emp1)) // false


const emp2: Employee = {
    name: {
        first: 'AAAhedon',
        last: 'wang'
    },
    salary: 2222,
    bonus: 2000
}

console.log(hasBadName(emp2)) // true

const emp3: Employee = {
    salary: 2222,
    bonus: 2000
}

console.log(hasBadName(emp3)) // undefined

# 3. 接口扩展

  • extends
interface HasName {
    name?: {
        first: string
        last: string
    }
}

interface Employee extends HasName{
    salary: number
    bonus?: number                  
}

# 4. 类型的并

  • 实际上,默认只能出现共有属性
interface WxButton {
    visible: boolean
    enable: boolean
    onClick(): void
}

interface WxImage {
    visible: boolean
    src: string
    width: number
    height: number
}

// union of type
function hideElement(e: WxButton | WxImage ) {
    // 只能出现共有的属性
    e.visible
}

# 5. 类型断言

interface WxButton {
    visible: boolean
    enable: boolean
    onClick(): void
}

interface WxImage {
    visible: boolean
    src: string
    width: number
    height: number
}

function processElement(e: WxButton | WxImage) {
    // 目标:
    // if e is WxButton
    //      e.onClick
    // else
    //      console.log(e.src)

    if ((e as any).onClick) {
        // 类型断言
        const btn = e as WxButton
        btn.onClick()
    } else {
        const img  = e as WxImage
        console.log(img.src)
    }
}
上次更新: 11/5/2021, 4:06:48 PM