泛型的可以理解为一个类似于基类概念的类型检查

1、如T泛型

  1. // T表示泛型
  2. function getData(value: any): any {
  3. return value;
  4. }
  5. getData(123)
  6. //getData('123')
  7. //getData(true)
  8. /**********************************************************************************/
  9. function getData<T>(value: T): T { // T表示泛型 可以保证函数的参数类型和返回值类型一致
  10. return value;
  11. }
  12. getData<number>(123)
  13. //getData<string>('123')
  14. //getData<boolean>(123)
  15. //这里的第一种写法和第二种写法是一样的效果 但是第一种写法使用any就等于放弃了类型检查

2、泛型类

  1. class Demo {
  2. getValue(val:number):number {
  3. return val
  4. }
  5. }
  6. let demo = new Demo();
  7. console.log(demo.getValue(1)); //1
  8. //这里的 Demo 只能传入number 类型的参数 不能传入string
  9. //这种情况下 可以用泛型类
  10. /**********************************************************************************/
  11. class Demo<T> {
  12. getValue(val:T):T {
  13. return this.a+val
  14. }
  15. }
  16. let demo = new Demo<number>();
  17. console.log(demo.getValue(1)); //1
  18. let demo2 = new Demo<string>();
  19. console.log(demo.getValue('2')); //2

3、泛型接口

泛型接口的第一种写法

  1. interface Demo{
  2. T(val?:T)T
  3. }
  4. let getData:Demo=function<T>(value:T):T{
  5. return value
  6. }
  7. getData<string>('12356')
  8. getData<number>(12356)
  9. getData<number>('123456') //错误写法

泛型接口的第二种写法

  1. interface Demo<T>{
  2. (val?:T)T
  3. }
  4. function getData<T>(value:T):T{
  5. return value
  6. }
  7. let myGetData:Demo<string>=getData;
  8. myGetData('20')
  9. myGetData(20) //错误写法