文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
十三、泛型
更多详情 http://blog.poetries.top/ts-axios/chapter2/generic.html
泛型就是解决 类 接口 方法的复用性、以及对不特定数据类型的支持。 泛型理解为代表类型的参数,只是另一个维度的参数
正确的做法
//只能返回 string 类型的数据 function getData(value:string):string{ return value; } //同时返回 string 类型 和 number 类型 (代码冗余) function getData1(value:string):string{ return value; } function getData2(value:number):number{ return value; } >>>>>>>>>>使用泛型后就可以解决这个问题 // T 表示泛型,具体什么类型是调用这个方法的时候决定的 // 表示参数是什么类型就返回什么类型~~~ function getData<T>(value:T):T{ return value; } getData<number>(123); getData<string>('1214231'); // 定义接口 interface ConfigFn{ <T>(value:T):T; } var getData:ConfigFn=function<T>(value:T):T{ return value; } getData<string>('张三'); getData<string>(1243); //错误
13.1 泛型函数和接口
// 这两个等价的,使用时无需指定类型 type Log = <T>(value: T) => T; // 只约束改成员 interface Log { <T>(value: T):T } // 这两个等价的,使用时必须指定类型 type Log<T> = (value: T) => T; // 约束接口的所有成员 interface Log<T> { (value: T):T }
13.2 泛型类与泛型约束
// 把泛型放到类的后面,就可以约束所有成员 class Log<T> { run(value: T) { return value } // 不能约束静态成员 // static eat() // 报错 } // 实例化类 传入类型 let log1 = new Log<number>() log1.run(1) // 不指定类型参数传任意都允许 let log2 = new Log() log2.run('1')
类型约束
interface Length { length: number } // T 继承了接口 约束了不是任意类型都可传。传入的参数必须有 length 属性 function log<T extends Length>(value: T): T { console.log(value, value.length) return value } // 如数组、字符串、对象都有 length 属性 log([1]) log('1') log({a:1})
- 函数和类可以轻松支持多种类型,增强程序的扩展性
- 不必写多条函数重载
- 灵活控制类型之间的约束
对象属性约束
// 泛型约束对象中的属性 function getProp<T,K extends keyof T>(obj:T,key: K) { return obj[key] }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论