泛型
不需要预先确定的数据类型,具体的类型在使用的时候才确定。
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
泛型的好处:
函数和类可以轻松的支持多种类型,增强程序的扩展性
不必写多条函数重载,冗长的联合类型声明,增强代码的可读性
灵活控制类型之间的约束