Typescript高级类型与泛型难点详解
let test: {};
test = 1;
test = null;
test = false;
function printer (param: string | number) {
console.log(param)
}
class Dog {
eat () {}
guardHome () {}
}
class Cat {
eat () {}
catchMice () {}
}
function animalFactory (): Dog | Cat {
if (Math.random() * 10 > 5) {
return new Dog();
} else {
return new Cat();
}
}
let ani = animalFactory();
ani.guardHome(); // error
ani.eat()
根据上面的结论, animalFactory 的返回值应该是Dog类或Cat类的实例都可以,但是却偏偏只有eat方法能调用成功,属于各自单独类的guardHome或 catchMice方法都不能调用成功。
let str;
let val: number = (str as string).length;
let val2: number = (<string>str).length;
let str;
function checkString (str: any): str is string {
return str;
}
function checkString (param: number | string) {
if (typeof param === 'string') {
let temp = param; //ok 此处param为string
param += '1'; //ok 此处param为 string | number
param += '1'; //ok 此处param为 string | number
param += 1; // ok 此处string类型可以与数字相加
return param; // 此处param为number
} else { // 此处此处相当于 if (typeof param === 'number')
param += 1; // ok 此处param为 string | number
param += '1'; // error number类型不能与字符串相加
return param // 此处param为number
}
}
interface testInter {
name: string,
age: number
}
let testArr: string[] = ['tate', 'pomelott'];
let testObj: testInter = {name: 'tate', age: 26}
先来验证数组:
function showKey<K extends keyof T, T> (key: K, obj: Array<string>) {
return key;
}
showKey<number, Array<string>>(1, testArr);
再来验证对象:
function showKey<K extends keyof T, T> (keyItem: K, obj: T): K {
return keyItem;
}
let val = showKey('name', testObj)
此处有个需要特别注意的点:使用泛型如何表示某个特定key组成的数组:
function showKey<K extends keyof T, T> (items: K[], obj: T): T[K][] {
return items.map(item => obj[item])
}
上例中的 T[K][] 意为K类型的数组,而且需要满足,K为T的key
真正理解了上面这句话,自然就会明白下面四种写法其实是等价的:
function showKey<K extends keyof T, T> (items: K[], obj: T): T[K][] {
return items.map(item => obj[item])
}
function showKey<K extends keyof T, T> (items: K[], obj: T): Array<T[K]> {
return items.map(item => obj[item])
}
function showKey<K extends keyof T, T> (items: K[], obj: {[K in keyof T]: any}): K[] {
return items.map(item => obj[item])
}
function showKey<K extends keyof T, T> (items: K[], obj: {[K in keyof T]: any}): Array<K> {
return items.map(item => obj[item])
}
let obj = showKey(['name'], testObj)
关于TS泛型和高级类型的新发现,持续更新中。。。
Typescript高级类型与泛型难点详解的更多相关文章
- C# vs TypeScript - 高级类型
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
- 从C#到TypeScript - 高级类型
C# vs TypeScript - 高级类型 上一篇讲了基础类型,基本上用基础类型足够开发了,不过如果要更高效的开发,还是要看下高级类型,这篇和C#共同点并不多,只是延用这个主题. 联合类型 可以从 ...
- STM32接口FSMC/FMC难点详解
STM32接口FSMC/FMC难点详解 转载 http://blog.sina.com.cn/s/blog_808bca130102x94k.html STM32F767的FMC将外部存储器划分为 ...
- PHP7中标量类型declare的用法详解
这篇文章主要介绍了PHP7标量类型declare用法,结合实例形式分析了PHP7中标量类型declare的功能.特性与相关使用技巧,需要的朋友可以参考下 本文实例讲述了PHP7标量类型declare用 ...
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
比如有一个匿名对象,var result =......Select( a=>new { id=a.id, name=a.name});然后Object obj = result ;我怎 ...
- java 泛型实例详解(普通泛型、 通配符、 泛型接口)
java 泛型详解(普通泛型. 通配符. 泛型接口) 2013-02-04 19:49:49| 分类: JAVA | 标签:java |举报|字号 订阅 下载LOFTER客户端 JDK1.5 令我们期 ...
- ( 转 ) MySQL高级 之 explain执行计划详解
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...
- MySQL高级 之 explain执行计划详解
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...
- MySQL高级 之 explain执行计划详解(转)
使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...
随机推荐
- 在Ubuntu上使用离线方式快速安装K8S v1.11.1
在Ubuntu上使用离线方式快速安装K8S v1.11.1 0.安装包文件下载 https://pan.baidu.com/s/1nmC94Uh-lIl0slLFeA1-qw v1.11.1 文件大小 ...
- python之路day02--格式化输出、初始编码、运算符
格式化输出 格式化输出替换字符串.字符串中%占位符,,%%s就是代表百分号,不代表占位符s 字符串 stringd 数字 dight name = input('请输入你的名字:') age = in ...
- vue 中 echart 在子组件中只显示一次的问题
问题描述 一次项目开发过程中,需要做一些图表,用的是百度开源的 echarts. vue推荐组件化开发,所以就把每个图表封装成子组件,然后在需要用到该图表的父组件中直接使用. 实际开发中,数据肯定都是 ...
- pytest 11 allure2生成html报告
allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest框架,也可以集成到Jenkins上展示高大上的报告界面. 环境准备 1.pyt ...
- Unity 阴影的制作方式
Unity阴影制作的三种方式. 方式一:Light中Shadow Type的类型 包括Hard Shadows.Soft Shadows.No Shadows: Mesh Renderer中的属性 ...
- 结合别人的文章,做RocketMQ的一点原理分析,结合源码(尽量)----未完待续
Broker 与Namesrv的关系 1.从namesrv获取配置信息 /** * BrokerConfig类 * * broker每隔30秒(此时间无法更改)向所有nameserver发送心跳,心跳 ...
- Linux grep \t Tab 键失效
解决方法 1.'$' 有一个日志文件, 比如说有两列, 中间使用 \t制表符分割了. 则在grep查找的时候 使用: '$'\t''\+ 代替我们的\t制表符 - 2.-P grep -P '\ ...
- SSRF漏洞挖掘经验
SSRF概述 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问 ...
- DeepLearning.ai学习笔记(四)卷积神经网络 -- week4 特殊应用:人力脸识别和神经风格转换
一.什么是人脸识别 老实说这一节中的人脸识别技术的演示的确很牛bi,但是演技好尴尬,233333 啥是人脸识别就不用介绍了,下面笔记会介绍如何实现人脸识别. 二.One-shot(一次)学习 假设我们 ...
- 帆软报表(finereport) 折叠树
在进行展现数据时,希望模板的数据是可以动态折叠的,即点击数据前面的加号才展开对应下面的数据,可通过树节点按钮实现折叠树效果 实现思路: 1.这里建立一个内置数据集 添加数据 设置模板样式,添加颜色和对 ...