# 接口

  • 对类的一部分行为进行抽象,也常用于 对象的形状 进行描述
interface Person {
  readonly id: number // 只读属性
  name: string
  age: number
  sex?: string // 可选属性
  [propName: string]: any | number // 任意属性
  study(knowleged: string): string // 函数
}

const person: Person = {
  name: 'jack',
  age: 18
}

# 接口的继承

// 支持继承多个接口
interface Student extends Person [, Interface] {
  no: number,
  classroom: string
}

# 函数

interface func {
  (a: number, b: number) => number
}

// 默认值 与 可选参数
function add(a: number = 1, b?: number): number {
  return a + b
}

let add: func = function (a: number, b: number) {
  return a + b
}

# 函数重载

// 重载签名
export function add(a: number, b: number): number
// 实现签名
export function add(a: string, b: string): string {
  return a + b
}

# 泛型

  • 泛型是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候在指定类型的一种特性
// 函数
function add<T> (a: T, b: T): T {
  return a + b
}
add<number>(1, 2)

// 接口
interface Person<T, U> {
  name: T
  age: U
}

const p: Person<string, number> = { name: 'xxx', age: 18 }

class Student<T> {
  name: T
}

const a = new Student<string>()

# 泛型约束

  • 由于泛型不确定数据类型 所以调用对象的某些属性与方法会导致ts报错 这时就需要泛型约束
// 通过接口限制泛型类型
interface StrLength {
  length: number
}

function getStrLength<T extends StrLength>(str: T): number {
  return str.length
}

# extends扩展

type T0 = 'a' | 'b'
type T1 = 'a' | 'c'

type EX<T, U> = T extends U ? never : T
EX<T0, T1> // 'b'

// extends 参数是联合类型时 会创建多条任务(分支) 分别进行判断
// 'a' extends 'a' | 'c' => never
// 'b' extends 'a' | 'c' => 'b'
// 合起来就是 返回 'b'