一、泛型

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学习笔记(三)泛型、模块化和命名空间的更多相关文章

  1. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  2. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  3. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  4. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  5. Typescript 学习笔记四:回忆ES5 中的类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. Typescript 学习笔记二:数据类型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  7. Typescript 学习笔记一:介绍、安装、编译

    前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...

  8. TypeScript学习笔记(八):1.5版本之后的模块和命名空间

    我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块 但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以 ...

  9. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

  10. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

随机推荐

  1. Java 创建PDF文件包的2种方法

    1. 概述 PDF文件包可方便在仅打开一个窗口的情况下阅读多个文档,通过将多个PDF文档或其他非PDF文档封装在一起,打开文件包后可以随意切换查看文件包中的文档,在需要编辑更改的情况,也可以打开文本包 ...

  2. 6.12、通过kvm可视化管理虚拟机

    6.12.1.通过Xmanager - Passive管理kvm虚拟机(首先要安装xmanager): 1.安装虚拟化管理软件: [root@centos7 ~]# yum install -y vi ...

  3. 正则表达式_爬取豆瓣电影排行Top250

    前言: 利用简单的正则表达式,获取响应内容爬取数据. Part1 正则表达式(Regular Expression) 1.1 简介 正则表达式,又称规则表达式,它是一种文本模式,就是通过事先定义好的一 ...

  4. Netty 框架学习 —— UDP 广播

    UDP 广播 面向连接的传输(如 TCP)管理两个网络端点之间的连接的建立,在连接的生命周期的有序和可靠的消息传输,以及最后,连接的有序终止.相比之下,类似 UDP 的无连接协议中则没有持久化连接的概 ...

  5. AcWing 1141. 局域网

    某个局域网内有n台计算机和m条 双向 网线,计算机的编号是1~n由于搭建局域网时工作人员的疏忽, 现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不停的在回路内传输,造成网络卡的现象 ...

  6. Flask(8)- jinja2 模板入门

    前言 之前的文章有个栗子,视图函数可以直接返回一段 html 代码,浏览器可以自动渲染 但是当你的 HTML 非常复杂的话,也要整串写在代码里面吗,这显然不合理的,可阅读性也非常差 所以,就诞生了 J ...

  7. Springboot:单元测试日志打印@Slf4j 注解的使用方法

    当自己写日志的时候,肯定需要: private final Logger logger = LoggerFactory.getLogger(LoggerTest.class); 每次写新的类,就需要重 ...

  8. leetcode 数组分成和相等的三个部分

    题目: 给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false. 形式上,如果可以找出索引 i+1 < j 且满足 (A[0] + A[1] + . ...

  9. CTF-Decrypt-the-Message-writeup

    Decrypt-the-Message 题目信息: 解密这段信息! 附件: The life that I have Is all that I have And the life that I ha ...

  10. File类与常用IO流第六章——使用try...catch...finally处理流中的异常

    在JDK1.7之前: 1 package com.itheima.demo06.trycatch; 2 3 import java.io.FileWriter; 4 import java.io.IO ...