泛型约束

有了泛型之后,一个函数或容器类能处理的类型一下子扩到了无限大,似乎有点失控的感觉。所以这里又产生了一个约束的概念。我们可以声明对类型参数进行约束。

我们还拿上文中的student栗子来说,想访问value的length属性,但是编译器并不能证明每种类型都有length属性,所以就报错了。

student = <T extends {}>(value: T): T => {//Property 'length' does not exist on type 'T'.ts(2339)console.log(value.length);return value;
}

相比于操作any所有类型,我们想要限制函数去处理任意带有.length属性的所有类型。 只要传入的类型有这个属性,我们就允许,就是说至少包含这一属性。 为此,我们需要列出对于T的约束要求。为此,我们定义一个接口来描述约束条件。 创建一个包含 .length属性的接口,使用这个接口和extends关键字来实现约束:

interface LengthDefine {length: number;
}
//这样函数定义是编译器就不会报错了
student = <T extends LengthDefine>(value: T): T => {console.log(value.length);return value;
}

调用:

传入的是字符串能,里面含有length属性,能正常运行

let name: string = this.student<string>(itemFun.getName('Jack'));

如果传入的是number类型的数字:

let age = this.student(10);
//Argument of type '10' is not assignable to parameter of type 'LengthDefine'.

我们需要传入符合约束类型的值,必须包含必须的属性:

let name: string = this.student<string>('Jack');
let age = this.student({length: 1, value: 10});
age的类型推导结果:
(property) Init.student: <{length: number;value: number;
}>(value: {length: number;value: number;
}) => {length: number;value: number;
}

约束为类型参数

我们可以声明一个类型参数,且它被另一个类型参数所约束。 比如,现在我们想要用属性名从对象里获取这个属性。 并且我们想要确保这个属性存在于对象 obj上,因此我们需要在这两个类型之间使用约束。

getProperty = <T, K extends keyof T>(obj: T, key: K) => {return obj[key]
}
let obj = {a:1, b:"2", c:3};
console.log(this.getProperty(obj, 'a'));
//1
console.log(this.getProperty(obj, 'd'));
//Argument of type '"d"' is not assignable to parameter of type '"a" | "b" | "c"'.ts(2345)

约束为类类型

在TypeScript使用泛型创建工厂函数时,需要引用构造函数的类类型。比如:

function create<T> (c: {new(): T;}): T {return new c();
}

使用原型属性推断并约束构造函数与类实例的关系

class Keeper1 {hasMask: boolean;
}class Keeper2 {nameTag: string;
}class Keeper3 {numLength: number;
}class ChildrenKeeper1 extends Keeper3 {keeper: Keeper1;
}class ChildrenKeeper2 extends Keeper3 {keeper: Keeper2;
}function createInstance<A extends Keeper3> (c: new() => A): A {return new c();
}console.log(createInstance(ChildrenKeeper1));
//ChildrenKeeper1 {}
console.log(createInstance(ChildrenKeeper2));
//ChildrenKeeper2 {}

TypeScript泛型约束相关推荐

  1. 学习TypeScript 之 Pick与泛型约束

    何为Pick? type Pick<T, K extends keyof T> = {[key in K]: T[key] } 就是从一个复合类型中,取出几个想要的类型的组合,例如: // ...

  2. TypeScript 泛型T使用整理

    一.介绍 相C#和Java等以上,TypeScript可以使用泛型来创建可重用的组件.支持当前数据类型,同时也能支持未来的数据类型.扩展灵活. 二.泛型的定义.使用 使用泛型可以创建泛型函数.泛型接口 ...

  3. TypeScript - 泛型

    前言 本文主要记录下 TypeScript 泛型知识点,日常学习总结篇. 一.概念 泛型(Generics)是指在定义函数.接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性. ...

  4. 【TS】1368- 秒懂 TypeScript 泛型工具类型!

    阿宝哥精心准备的<轻松学 TypeScript> 视频教程已经更新到第十九期了,合集播放量已达 14W+.通过形象生动的动画,让你轻松搞懂 TypeScript 的难点和核心知识点! 如果 ...

  5. TypeScript 泛型

    TS里面有泛型让我很意外,这个比AS3确实要强大: let myIdentity_change : <T>(arg:T)=>T=function(a){ return a };con ...

  6. .NET支持的泛型约束

    .NET支持的类型参数约束有以下五种: where T : struct | T必须是一个结构类型 where T : class T必须是一个类(class)类型 where T : new() | ...

  7. 淡谈泛型约束T(转)

    .net泛型约束 2007-10-06 14:08:54|  分类: .net |字号 订阅 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型.泛型编程是一种编程范式,它利用" ...

  8. TypeScript泛型

    泛型的概念 指不预先确定的数据类型,具体的类型要在使用的时候才能确定.咋一听,是不是觉得JavaScript本身就是这样?这是由于理解有误.前面说"在使用的时候确定",而非在程序执 ...

  9. C#高级语法之泛型、泛型约束,类型安全、逆变和协变(思想原理)

    一.为什么使用泛型? 泛型其实就是一个不确定的类型,可以用在类和方法上,泛型在声明期间没有明确的定义类型,编译完成之后会生成一个占位符,只有在调用者调用时,传入指定的类型,才会用确切的类型将占位符替换 ...

最新文章

  1. js 实现多选框(复选框) 和单选框,下拉框功能完整示例代码附效果图
  2. fcm和firebase_我如何最终使Netlify Functions,Firebase和GraphQL一起工作
  3. Facebook为其全球75%的用户推出反模仿工具
  4. asp伪装成jsp的方法
  5. python函数定义错误_[转载]python之函数的使用及异常处理2021.1.30
  6. 创建android程序时 默认使用布局是,《Android移动应用基础教程》中国铁道出版社课后习题(附答案)...
  7. SAP CRM事务码COMMPR01无法搜索Individual Object
  8. 游戏开发引擎 Cryengine 在 GitHub 上公开全部源代码
  9. 开源日志系统比较:scribe,chukwa,kafka,flume
  10. php string to xml,php 字符串如何转换成xml
  11. 记录打开RIDE闪退问题
  12. word2vec——训练自己的word2vec模型
  13. php制作登录页面的过程_PHP实现简单登录界面
  14. LA 4394 刷字符串(区间dp)
  15. 《Learning Discriminative Features with Multiple Granularities for Person Re-Identification》论文阅读之MGN
  16. 【Linux】VMware使用 - 虚拟机克隆
  17. 第4季2:并口、MIPI、LVDS的简介
  18. 科普 | 处理器RISC和CISC架构分析对比
  19. 电脑开关坏了,用Reset键代替开关机键盘
  20. 51nod_2929 部落战争(DAG最小路径覆盖)

热门文章

  1. c++11 多线程 顺序执行_前阿里P8架构师总结的一些关于Java多线程的编程经验丨干货...
  2. [译] 如何学习 CSS
  3. The Economist经济学人是如何使用Go语言构建内容平台微服务架构的?
  4. 网络流入门题目 - bzoj 1001
  5. Kafka监控:Kafka-Manager
  6. 【问题】Nginx日志中request_body为空
  7. JAVA 支付宝退款接口
  8. Linux之使用网络
  9. Oracle 11gR2 RAC OCR和votingdisk故障恢复案例
  10. 创建variant二维数组