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 ...
随机推荐
- 初识并发编程 MPI
MPI是一个跨语言的通讯协议,用于并发编程.MPI标准定义了一组具有可移植性的编程接口. 安装环境 MPICH 是开源的消息传递接口(MPI)标准的实现. 下载地址 # 解压文件 tar -xzvf ...
- min-max容斥学习笔记
min-max容斥学习笔记 前置知识 二项式反演 \[ f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^{ ...
- grovvy身份证(全)
import java.text.DecimalFormat import java.text.SimpleDateFormat import java.util.Calendar; import j ...
- Python终极coding
作为一名程序员,除了需要具备解决问题的思路以外,代码的质量和简洁性也很关键.因为从一个人的代码可以直接看出你的基本功.对于Python而言,这就意味着你需要对Python的内置功能和库有很深入的了解. ...
- 2018-2019-2 《Java程序设计》第2周学习总结
20175319 2018-2019-2 <Java程序设计>第2周学习总结 教材学习内容总结 第二周学习了<Java2实用教程>第二章.第三章的内容关于Java基本数据类型与 ...
- An Apple a day keeps the doctor away
An apple a day keeps the doctor away. 一天一苹果,不用请医生. 活学活用:apple as like as an apple to an oyster 毫无相同之 ...
- 学习WPF
http://www.cnblogs.com/prism/archive/2010/07/21/1781855.html 如何在WPF中画三角,以及把按钮设置成颜色渐变的样式:
- oracle建表 和 设置主键自增
1.新建table CREATE TABLE ysb_log( id ) primary key not null , tbdate ) NULL, tb_time ) NOT NULL, tblog ...
- sublim 插件
sublim 插件 https://www.cnblogs.com/hykun/p/sublimeText3.html html 代码自动 + tab ul>li>img+p+a ! ul ...
- c语言宏定义详解
1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数 ...