TypeScript学习笔记(三)泛型、模块化和命名空间
一、泛型
1. 泛型函数
function getMin<T>(arr: T[]):T {
if(arr.length === 0) {
throw new Error("输入的数组没有元素");
}
let res: T = arr[0];
for (let i = 1; i < arr.length; i++) {
if(arr[i] < res) {
res = arr[i];
}
}
return res;
}
和 C++ 的泛型函数非常类似
2. 泛型类
下面这个类可以求出当前列表中最小的元素
class MinClass<T> {
private dataArr: T[] = [];
public add(...val: T[]): void {
this.dataArr.push(...val);
}
public getMin(): T {
if(this.dataArr.length === 0) {
throw new Error("当前数组没有元素");
}
let res: T = this.dataArr[0];
for (let i = 1; i < this.dataArr.length; i++) {
if(this.dataArr[i] < res) {
res = this.dataArr[i];
}
}
return res;
}
}
3. 泛型接口
写法一
interface ConfigFn {
<T>(value:T):T;
}
let getData:ConfigFn = function<T>(value:T):T {
return value;
}
getData<string>("张三");
写法二
interface ConfigFn<T> {
(value:T): T;
}
function getData<T>(value:T) {
return value;
}
var myGetData:ConfigFn<string> = getData;
myGetData("20");
两种写法的区别
- 写法一:一般用于在使用时才规定泛型的类型,用法类似泛型函数
- 写法二:一般用于约束函数参数传递的类型,类似
Java中的:
public void func(List<Integer> array){
...
}
这样的参数约束。
二、模块化
在 TypeScript 中一个 ts 文件中的函数和变量都是该文件私有的,只有通过 export 输出才能被外部调用。
1. export写法一
例如以下情况,我们希望暴露两个函数供外部调用,可以这样写:
// db.ts
export function getData():any[] {
console.log("获取数据库的数据");
return [
{ title:"121312" },
{ title:"123123" }
]
}
export function save() {
console.log("保存数据成功")
}
在需要使用的地方使用 import 关键字进行引入,语法如下:
import { aaa,bbb } from "模块的路径";
注意,引入时不需要加最后的 .ts 后缀名,示例如下:
// index.ts
import { getData,save } from "./05module";
let data:any[] = getData();
console.log(data);
save();
因为模块的输出默认是以对象形式进行的(即所有export的东西都被封装到一个对象中),所以如果我们希望直接使用其他模块的方法或字段,需要使用 {} 运算符取出来再使用。
2. export写法二
我们也可以将所有的东西统一输出,避免编写多个 export:
function getData():any[] {
console.log("获取数据库的数据");
return [
{ title:"121312" },
{ title:"123123" }
]
}
function save() {
console.log("保存数据成功")
}
// 将所有需要输出的东西包装成对象
export {
getData,
save
}
3. 为引入的方法或变量起别名
当我们觉得引入的方法或变量的名字使用起来不太方便等时可以为它们起别名,使用 as 关键字:
import { save as saveData } from "./05module";
saveData();
4. export default的使用
一个模块中 export default 只能使用一次,一般当只希望暴露一个方法时可以使用,例如:
// db.ts
function getData():any[] {
console.log("获取数据库的数据");
return [
{ title:"121312" },
{ title:"123123" }
]
}
export default getData;
而此时的引入也不相同:
import getData from "./05module";
let data:any[] = getData();
console.log(data);
在引入的时候我们不需要使用 {} 操作符进行获取了,此外我们 import 后面的变量名也不需要和export的变量相同:
import hello from "./05module";
let data:any[] = hello();
console.log(data);
这样也是可以得到正确结果的
tips:使用
export来导出一个类的操作和导出变量和方法的操作都是相同的,因为编译成js代码后,一个类本质上就是一个构造函数,在js中函数就是一种变量类型,因此操作都是一致的。
三、命名空间
语法:
namespace 命名空间名 {
...
}
作用:一个模块内可以有多个命名空间,不同命名空间中的相同标识符的变量、函数和类等等可以重名不发生冲突。
导出命名空间:
export namespace A {
...
}
引入命名空间的方法和引入变量及函数的方式一致。
tips:命名空间中的内容默认都是私有的,即使导出了命名空间,但默认还是无法直接使用到命名空间内部的
函数和类的,需要将它们也export出来。
示例:
export namespace A {
interface Animal {
name: string;
eat():void;
}
export class Dog implements Animal {
name: string;
constructor(name:string) {
this.name = name;
}
eat(): void {
console.log(`小狗${this.name}在吃狗粮`);
}
}
export class Cat implements Animal {
name: string;
constructor(name:string) {
this.name = name;
}
eat(): void {
console.log(`小猫${this.name}在吃鱼`);
}
}
}
let dog = new A.Dog("小黑");
dog.eat();

TypeScript学习笔记(三)泛型、模块化和命名空间的更多相关文章
- Typescript 学习笔记三:函数
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记二:数据类型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记一:介绍、安装、编译
前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...
- TypeScript学习笔记(八):1.5版本之后的模块和命名空间
我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块 但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以 ...
- 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
随机推荐
- OSPF路由协议
一.OSPF的工作过程 二.OSPF的基本概念 三.DR与BDR 四.OSPF数据包类型 五.OSPF邻接关系的建立 六.OSPF的路由器类型 一.OSPF的工作过程 OSPF路由协议针对每一个区域分 ...
- 企业该选择什么样的CRM系统
不论您是需要CRM系统来优化业务流程,还是准备更换一款新的CRM系统,在这之前都应该先明确企业的需求,并了解CRM的哪些功能能够对企业有所帮助.例如,企业的管理者想了解每个销售人员的业绩情况,那么就应 ...
- AcWing 1289. 序列的第k个数
BSNY 在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列. 现在给你 整数 序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第k项的值吗. 如果第k项的值太大, ...
- mysql导入脚本
#登陆 mysql -u root -p #创建数据库 CREATE DATABASE `gps` CHARACTER SET utf8 COLLATE utf8_general_ci; #选择数据库 ...
- Vue3 + TypeScript 开发实践总结
前言 迟来的Vue3文章,其实早在今年3月份时就把Vue3过了一遍.在去年年末又把 TypeScript 重新学了一遍,为了上 Vue3 的车,更好的开车.在上家公司4月份时,上级领导分配了一个内部的 ...
- MyBatis框架中的条件查询!关键字exists用法的详细解析
exists用法 exists: 如果括号内子查询语句返回结果不为空,说明where条件成立,就会执行主SQL语句 如果括号内子查询语句返回结果为空,说明where条件不成立,就不会执行主SQL语句 ...
- 第六章 time库的使用
time库概述 time库是python中处理时间的标准库 1.用于计算机时间的表达 2.提供获取系统时间并格式化输出功能 3.提供系统级精确计时功能,用于程序性能分析 1 import time 2 ...
- CF1539D PriceFixed[题解]
PriceFixed 题目大意 市场上又 \(n\) 种商品,每种商品的价格都是 \(2\) .对于第 \(i\) 种商品 \(a_i\) 件.对于商品 \(i\) 给出一个值 \(b_i\) ,如果 ...
- [网络流24题]最长k可重区间集[题解]
最长 \(k\) 可重区间集 题目大意 给定实心直线 \(L\) 上 \(n\) 个开区间组成的集合 \(I\) ,和一个正整数 \(k\) ,试设计一个算法,从开区间集合 \(I\) 中选取开区间集 ...
- UI自动化测试框架Gauge 碰到无法识别Undefined Steps 红色波纹标记
如果碰到无法识别的情况,例如下面的红色波纹,可以试一下: 第一步: 第二步: 不勾选'offline work' 第三部:刷新之后可以重新编译.