# 接口
- 对类的一部分行为进行抽象,也常用于 对象的形状 进行描述
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'