Skip to content
On this page

泛型

不需要预先确定的数据类型,具体的类型在使用的时候才确定。

ts
function log<T>(value: T): T {
    return value
}

log<string[]>(['a', 'b'])
log([1, 2])

定义泛型函数类型

ts
type Log = <T>(value: T) => T

let myLog:Log = log

定义泛型接口

ts
interface Log<T = string> {
    (value: T): T
}

let myLog: Log<number> = log
myLog(1)

泛型类

泛型不能约束类的静态成员

ts
class Log<T> {
    run(value: T) {
        return value
    }
}

let log1 = new Log<number>()
log1.run(1)

let log2 = new Log() // 不指定即可以任意值
log2.run('2')

泛型约束

约束传入的值必须是什么类型

ts
interface Length {
    length: number
}

// 传入的值必须存在 length 属性
function log<T extends Length>(value: T):T {
    console.log(value, value.length)
    return value
}

log([1])
log('123')
log({length: 1})

TIP

泛型的好处:

  • 函数和类可以轻松的支持多种类型,增强程序的扩展性

  • 不必写多条函数重载,冗长的联合类型声明,增强代码的可读性

  • 灵活控制类型之间的约束