返回介绍

十三、泛型

发布于 2024-09-07 18:09:17 字数 1944 浏览 0 评论 0 收藏 0

更多详情 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文