TypeScript 语言学习入门级教程五
在前面的教程中,我们已经逐步深入地学习了 TypeScript 的诸多特性,包括基础语法、类型系统、面向对象编程、装饰器以及一些高级类型等。在本教程中,我们将聚焦于 TypeScript 的模块系统、命名空间与模块的关系、声明文件以及如何在实际项目中更好地组织和构建 TypeScript 代码等内容,帮助大家进一步提升 TypeScript 的应用能力,使其能够更好地融入到复杂的项目开发流程中。
一、模块系统
TypeScript 支持多种模块系统,如 CommonJS、AMD、UMD 和 ES6 模块等。在现代的前端和后端开发中,ES6 模块系统因其简洁性和原生支持性而被广泛应用。
1. 模块的导出与导入
在一个 TypeScript 文件中,可以使用 export 关键字导出变量、函数、类、接口等。例如:
// math.ts
export const PI: number = 3.14159;export function add(a: number, b: number): number {return a + b;
}export class Rectangle {constructor(public width: number, public height: number) {}area(): number {return this.width * this.height;}
}
在另一个文件中,可以使用 import 语句导入这些导出的成员:
// main.ts
import { PI, add, Rectangle } from './math';console.log(PI);
console.log(add(2, 3));const rect = new Rectangle(4, 5);
console.log(rect.area());
2. 模块的默认导出
除了命名导出,还可以使用默认导出。一个模块只能有一个默认导出。例如:
// person.ts
export default class Person {constructor(public name: string, public age: number) {}greet(): string {return `Hello, my name is ${this.name} and I'm ${this.age} years old.`;}
}
在导入默认导出时,可以使用任意名称:
// app.ts
import MyPerson from './person';const person = new MyPerson('John', 30);
console.log(person.greet());
二、命名空间与模块的关系
在 TypeScript 中,命名空间主要用于在旧的代码库或项目中组织代码,避免全局命名冲突。然而,随着模块系统的发展,特别是 ES6 模块的广泛应用,命名空间的使用场景逐渐减少。
命名空间是内部模块,它将相关的代码逻辑封装在一个命名空间内,并且可以嵌套使用。例如:
namespace Geometry {export namespace Shapes {export class Circle {constructor(public radius: number) {}area(): number {return Math.PI * this.radius ** 2;}}}
}const circle = new Geometry.Shapes.Circle(2);
console.log(circle.area());
但在新的项目开发中,建议优先使用模块系统,因为模块具有更好的静态分析能力、代码拆分和复用性,并且与现代构建工具和打包器(如 Webpack、Rollup 等)更好地集成。
三、声明文件
当使用第三方 JavaScript 库时,由于这些库没有原生的 TypeScript 类型定义,我们需要使用声明文件来为其添加类型支持。
1. 编写声明文件
例如,假设我们有一个简单的 JavaScript 库 myLib.js,它包含一个函数 sayHello:
// myLib.js
function sayHello(name) {console.log('Hello,'+ name);
}module.exports = {sayHello
};
我们可以为它编写一个声明文件 myLib.d.ts:
// myLib.d.ts
declare function sayHello(name: string): void;export = {sayHello
};
这样,在 TypeScript 文件中就可以正确地导入和使用这个库,并获得类型检查:
// app.ts
import * as myLib from './myLib';myLib.sayHello('TypeScript');
2. 使用社区的声明文件
对于许多流行的 JavaScript 库,如 jQuery、React 等,已经有社区维护的声明文件,可以通过 @types 包来安装。例如,安装 jQuery 的声明文件:
npm install --save-dev @types/jquery
然后就可以在 TypeScript 项目中正常使用 jQuery,并享受类型检查的好处。
四、项目代码组织与构建
在实际的 TypeScript 项目中,合理的代码组织和构建流程是非常重要的。
1. 项目结构
一般来说,一个典型的 TypeScript 项目结构可能如下:
project/- src/- components/- Component1.tsx- Component2.tsx- services/- ApiService.ts- utils/- helper.ts- index.ts- dist/- node_modules/- tsconfig.json- package.json
其中,src 目录包含项目的源代码,按照功能模块或组件进行划分。dist 目录用于存放编译后的 JavaScript 文件,可以通过配置构建工具(如 Webpack 或 Rollup)将 src 目录下的 TypeScript 文件编译并输出到 dist 目录。
2. 构建工具配置
以 Webpack 为例,需要安装相关的依赖:
npm install webpack webpack-cli ts-loader --save-dev
然后配置 webpack.config.js 文件:
const path = require('path');module.exports = {entry: './src/index.ts',output: {path: path.resolve(__name__, 'dist'),filename: 'bundle.js'},module: {rules: [{test: /\.tsx?$/,use: 'ts-loader',exclude: /node_modules/}]},resolve: {extensions: ['.ts', '.tsx', '.js']}
};
通过这样的配置,就可以使用 webpack 命令将 TypeScript 项目进行构建,生成可在浏览器或其他环境中运行的 JavaScript 文件。
通过本教程的学习,我们对 TypeScript 的模块系统、命名空间与模块的关系、声明文件以及项目代码组织与构建等方面有了更深入的了解。这些知识将帮助大家在实际项目开发中更好地运用 TypeScript,构建出结构清晰、易于维护和扩展的应用程序。继续深入学习和实践 TypeScript 的各种特性和最佳实践,不断提升自己的开发技能,以适应日益复杂的前端和后端开发需求。
如果在学习过程中有任何疑问或建议,欢迎留言交流。
相关文章:
TypeScript 语言学习入门级教程五
在前面的教程中,我们已经逐步深入地学习了 TypeScript 的诸多特性,包括基础语法、类型系统、面向对象编程、装饰器以及一些高级类型等。在本教程中,我们将聚焦于 TypeScript 的模块系统、命名空间与模块的关系、声明文件以及如何在实际项目中…...
上海市计算机学会竞赛平台2022年7月月赛丙组匹配括号(三)
题目描述 如果字符序列仅由 ( 与 ) 构成,则在满足以下条件时,它是匹配的: 空序列是匹配的;如果括号序列 s 是匹配的,那么 (s) 也是匹配的;如果括号序列 s 与 t 是匹配的,那么 st 也是匹配的。…...
108.【C语言】数据结构之二叉树查找值为x的节点
目录 1.题目 代码模板 2.分析 分类讨论各种情况 大概的框架 关键部分(继续递归)的详解 递归调用展开图 3.测试结果 其他写法 4.结论 5.注意事项 不推荐的写法 1.题目 查找值为x的节点并返回节点的地址 代码模板 typedef int BTDataType; typedef struct BinaryT…...
Java学习笔记(10)--面向对象基础
学习资料来自黑马程序员 目录 设计对象并使用 类和对象 定义类 创建类的对象 使用对象 类的几个补充注意事项 设计对象并使用 类和对象 类(设计图):是对象共同特征的描述。 对象:是真实存在的具体东西。 在Java中必须先…...
社群分享在商业引流与职业转型中的作用:开源 AI 智能名片 2+1 链动模式小程序的应用契机
摘要:本文聚焦于社群分享在商业领域的重要性,阐述其作为干货诱饵在引流方面的关键意义。详细探讨了提供有价值干货的多种方式,包括文字分享、问题解答以及直播分享等,并分析了直播分享所需的条件。同时,以自身经历为例…...
nodejs官方文档学习-笔记-1
一、异步工作 process.nextTick(): 回调会在当前操作完成后立即执行,但在事件循环进入下一个阶段之前。它是最先执行的。 Promise.then(): 回调会在 microtask 队列中执行,通常是在当前操作完成后,但在事件循环进入…...
android视频播放器之DKVideoPlayer
一个老牌子的播放器了,项目可能已经有些日子没有维护了。但是使用效果还是不错的。支持多种视频格式,及重力感应、调节亮度等多种效果。想来想去,还是记录下来,我会在文章的最后注明github地址: 首先引入依赖ÿ…...
Linux——基础命令(3)
1.Linux——基础命令(1)-CSDN博客 2.Linux——基础命令(2) 文件内容操作-CSDN博客 一、打包压缩 打包压缩 是日常工作中备份文件的一种方式 在不同操作系统中,常用的打包压缩方式是不同的选项 含义 Windows 常用 rar…...
MySQL备份恢复
华子目录 MySQL日志管理为什么需要日志日志作用日志文件查看方法错误日志通用查询日志慢查询日志示例 撤销日志重做日志二进制日志---重要中继日志 MySQL备份备份类型逻辑备份优缺点备份内容备份工具导入sql文件 MySQL日志管理 为什么需要日志 用于排错用来做数据分析了解程序…...
鲲鹏麒麟安装离线版MySQL5.7
最近有项目需求,需要在鲲鹏ARM服务器上安装数据库MySQL5.7,服务器为鲲鹏920,操作系统Kylin Linux Advanced Server release V10 (Tercel) 安装包 下载地址:https://cloud.189.cn/t/JRVnmeEvMRZ3(访问码:t…...
【不稳定的BUG】__scrt_is_managed_app()中断
【不稳定的BUG】__scrt_is_managed_app函数中断 参考问题详细的情况临时解决方案 参考 发现出现同样问题的文章: 代码运行完所有功能,仍然会中断 问题详细的情况 if (!__scrt_is_managed_app())exit(main_result);这里触发了一个断点很奇怪,这中断就发生了一次,代…...
MyBatis 详解
MyBatis 是一个优秀的 持久层框架,它支持定制化 SQL、存储过程以及高级映射,能够很好地降低 Java 应用程序对数据库操作的复杂性。以下是对 MyBatis 的详细解析: 1. MyBatis 简介 MyBatis 是 Apache 的一款开源框架,其核心特性是…...
Cursor+Devbox AI开发快速入门
1. 前言 今天无意间了解到 Cursor 和 Devbox 两大开发神器,初步尝试以后发现确实能够大幅度提升开发效率,特此想要整理成博客以供大家快速入门. 简单理解 Cursor 就是一款结合AI大模型的代码编辑器,你可以将自己的思路告诉AI,剩下的目录结构的搭建以及项目代码的实现均由AI帮…...
编写按层次顺序(同一层自左至右)遍历二叉树的算法。或:按层次输出二叉树中所有结点;
解:思路:既然要求从上到下,从左到右,则利用队列存放各子树结点的指针是个好办法。 这是一个循环算法,用while语句不断循环,直到队空之后自然退出该函数。 技巧之处:当根结点入队后,会…...
docker 安装mysql8.0.29
docker 安装mysql8.0.29 1、拉取镜像 docker pull mysql:8.0.292、启动容器 docker run -p 3306:3306 --name mysql8.0.29 -e MYSQL_ROOT_PASSWORDroot -d mysql:8.0.29-p 将本地主机的端口映射到docker容器端口(因为本机的3306端口已被其它版本占用,所以使用330…...
vue深入理解输入框字符限制的优化设计
文章目录 深入理解输入框字符限制的优化设计背景与挑战输入框限制的重要性常见需求 多种实现方法解析方法一:基于实时过滤的字符限制方法二:借助正则验证方法三:提交时二次校验 性能优化无障碍设计延伸场景与最佳实践1. 多语言国际化支持2. 动…...
完整指南:在Ubuntu 20.04 ROS 1环境中配置和使用Orbbec SDK
完整指南:在Ubuntu 20.04 ROS 1环境中配置和使用Orbbec SDK 要在Ubuntu 20.04系统中使用ROS 1环境配置和使用Orbbec SDK,可以遵循以下详细且系统化的步骤。这些步骤将引导您从下载必要的工具和SDK到学习如何使用这些资源,确保您能有效地利用…...
【Leetcode Top 100】138. 随机链表的复制
问题背景 给你一个长度为 n n n 的链表,每个节点包含一个额外增加的随机指针 r a n d o m random random,该指针可以指向链表中的任何节点或空节。 构造这个链表的 深拷贝。 深拷贝应该正好由 n n n 个 全新 节点组成,其中每个新节点的值…...
2024年12月HarmonyOS应用开发者基础认证全新题库
注意事项:切记在考试之外的设备上打开题库进行搜索,防止切屏三次考试自动结束,题目是乱序,每次考试,选项的顺序都不同 更新时间:2024年12月3日 这是基础认证题库,不是高级认证题库注意看清楚标…...
Flink问题总结
目录 1、Flink 的四大特征(基石) 2、Flink 中都有哪些 Source,哪些 Sink,哪些算子(方法) 3、什么是侧道输出流,有什么用途 4、Flink 中两个流如何合并为一个流 5、Flink 中两个流如何 join 6、Flink 中都有哪些 window,什么是滑动,滚动窗口 7、flink 中都有哪些…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
