泛型:不预先确定的数据类型,具体的类型在使用的时候才能确定。
泛型好处:
1.函数和类可以轻松的支持多种类型,增强程序的扩展性
2.不必写多条函数重载,冗长的联合类型声明,增强代码可读性。
3.灵活控制类型之间的约束
泛型函数
function log <T>(value: T): T {
console.log(value)
return value
}
调用方式:
(1)log<string[]>(['a','b'])
(2)log(['a','b']) // 类型断言
泛型类型
type Log = <T>(value: T) => T
let mylog : Log = log
泛型接口
interface Log <T = string> {
(value : T) : T
}
let mylog : Log = log
mylog( '1' )
泛型类
泛型不能应用与类的静态成员: static run () 报错。
class log <T> {
run (value : T ) {
console.log(value)
return value
}
}
let log1 = new log<number>()
log1.run(1)
let log2 = new log() //当不指定类型的时候, run可以传入任意参数
log2.run('111')
泛型约束
interface length{
length:number
}
function log <T extends length>(value : T) : T {
console.log(value,value.length)
return value
}
// T继承了length接口,表示T受到了一定的约束,不再是任意类型都可以传了。输入的参数不管是什么类型,但是一定要有length属性。
log([1])
log('123')
log({length:1})