泛型函数、泛型接口、泛型类、泛型约束

很多时候我们需要一个函数或者一个类支持多种数据类型。

泛型:

概念:不预先确定的数据类型,具体的类型在使用的时候才能确定。
好处:1.函数和类可以轻松地支持多种类型,增强程序的扩展性
2.不必写多条函数重载,冗长的联合类型声明,增强代码可读性
3.灵活控制类型之间的约束

泛型函数
function log<T> (value: T): T {
  console.log(value)
  return value;
}
log<string[]>(['a','b'])  // 调用
log(['a','b'])    // 类型推断 调用
泛型函数类型
 type Log = <T>(value: T) => T
let myLog: Log  = log
泛型接口
 interpace Log<T> {
     (value: T) : T
 }
let  myLog: Log<number>  = log
myLog(1)

 interpace Log<T = string> {
     (value: T) : T
 }
let  myLog: Log  = log
myLog('1')
泛型类
class Log<T> { // 约束所有类的成员,但是不能约束static成员
  run(value: T) {
    console.log(value)
    return value
  }
}
let log1 = new Log<number>()
log1.run(1) //值必须为number类型
let log2 = new Log() //当不指定类型参数的时候,value的值可以是任意的值
log2.run({a:1})
log2.run('111')
泛型约束
  function log<T extends Length> (value: T): T {  // 让类型T继承Length接口
    console.log(value, value.length) // 打印length属性,提示T类型上不存在length属性
    return value;
  }
  不存在length属性,这时候用到泛型约束
   interface Length {
       length: number
   }
   log([111])
   log(['1231'])
   log({length: 1})
   // 以上只要有length属性都可以
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容