理解TypeScript模块-声明-配置

目录

  • 模块化
  • 内置类型导入
  • 命名空间
  • 类型查找
  • 内置类型
  • 外部定义声明
    • 第三方库
    • 自定义声明
  • `tsconfig.json`文件
  • 在Vue项目中应用
  • 在React项目中应用

模块化

TypeScript中最主要使用的模块化方案就是ES Module,先理解 TypeScript 认为什么是一个模块:

  • JavaScript 规范声明任何没有 exportJavaScript 文件都应该被认为是一个脚本,而非一个模块

  • TypeScript中如果你有一个文件,现在没有任何 import 或者 export,但是你希望它被作为模块处理,添加这行代码 export {}

  • 这会把文件改成一个没有导出任何内容的模块,这个语法可以生效,无论你的模块目标是什么

内置类型导入

需要使用 type 前缀 ,表明被导入的是一个类型,可以让一个非 TypeScript 编译器比如 Babel、swc 或者 esbuild 知道什么样的导入可以被安全移除
在这里插入图片描述

// ./type/index
export type IDType = number
export interface IFoo {
  name: string
  age: number
}


// main.ts
// import { type IFoo, type IDType } from "./type/index"; // 方式一
import type { IFoo, IDType } from "./type/index"; // 方式二

const id: IDType = 12121212121
const foo: IFoo = {
  name: 'foo',
  age: 18
}

命名空间

TypeScript 有它自己的模块格式名为 namespaces ,它在 ES 模块标准之前出现
在这里插入图片描述

  • 命名空间在TypeScript早期时,称之为内部模块,目的是将一个模块内部再进行作用域的划分,防止一些命名冲突的问题

  • 虽然命名空间没有被废弃,但是由于 ES 模块已经拥有了命名空间的大部分特性,因此更推荐使用 ES 模块,这样才能与 JavaScript 的(发展)方向保持一致

  • namespace:关键字,用于声明一个命名空间

  • export:将变量、函数或类导出到命名空间外,以便外部可以访问它们

// 基本语法
namespace MyNamespace {
  export const name: string = 'TypeScript';
  export function greet() {
    console.log('Hello from', name);
  }
  export class Person {
    constructor(public name: string) {}
  }
}

// 使用命名空间
MyNamespace.greet(); // 输出: Hello from TypeScript
const person = new MyNamespace.Person('Alice');
console.log(person.name); // 输出: Alice

// 嵌套语法
namespace MyNamespace {
  export namespace Utils {
    export function logMessage(message: string) {
      console.log('Log:', message);
    }
  }
}
MyNamespace.Utils.logMessage('This is a message'); // 输出: Log: This is a message

// 嵌套语法别名使用
import Utils = MyNamespace.Utils;
Utils.logMessage('Using alias'); // 输出: Log: Using alias

类型查找

之前我们所有的typescript中的类型,几乎都是我们自己编写的,但是也有用到一些其他的类型,我们看下 typescript对类型的管理和查找规则

  • 一种 .d.ts 文件,它是用来做类型的声明(declare),称之为类型声明(Type Declaration)或者类型定义(Type Definition)文件

  • 它仅仅用来做类型检测,告知typescript我们有哪些类型

  • typescript会查找这些类型声明

    • 内置类型声明

    • 外部定义类型声明

    • 自己定义类型声明

内置类型

内置类型声明是typescript自带的、帮助我们内置了JavaScript运行时的一些标准化API的声明文件

  • 包括比如 Function、String、Math、Date 等内置类型

  • 包括运行环境中的DOM API,比如Window、Document

  • TypeScript 使用模式命名这些声明文件lib.[something].d.ts
    在这里插入图片描述

  • 内置类型声明通常在我们安装typescript的环境中会带有的https://github.com/microsoft/TypeScript/tree/main/lib

  • 可以通过targetlib来决定哪些内置类型声明是可以使用的,例如startsWith字符串方法只能从称为ECMAScript 6JavaScript 版本开始使用

  • 可以通过target的编译选项来配置TypeScript通过lib根据您的target设置更改默认包含的文件来帮助解决此问题 https://www.typescriptlang.org/tsconfig#lib

外部定义声明

外部类型声明通常是我们使用一些库(比如第三方库)时,需要的一些类型声明

这些库通常有两种类型声明方式

  • 方式一:在自己库中进行类型声明(编写.d.ts文件),比如axios
    在这里插入图片描述

    • 方式二:通过社区的一个公有库DefinitelyTyped存放类型声明文件
      在这里插入图片描述

    • 该库的GitHub地址:https://github.com/DefinitelyTyped/DefinitelyTyped/

    • 该库查找声明安装方式的地址:https://www.typescriptlang.org/dt/search?search=

    • 比如安装react的类型声明: npm i @types/react --save-dev

第三方库

什么情况下需要自己来定义声明文件呢?

  • 情况一:使用的第三方库是一个纯的JavaScript,没有对应的声明文件,比如lodash
    在这里插入图片描述

  • 情况二:给自己的代码中声明一些类型,方便在其他地方直接进行使用

自定义声明

也可以声明模块,比如lodash模块默认不能使用的情况,可以自己来声明这个模块

  • declare声明模块:
    declare module '模块名' {},在声明模块的内部,可以通过 export 导出对应库的类、函数等

    // XXX.d.ts
    declare module 'lodash' {
      export function join(args: any[]): any
    }
    
    // XXX.ts
    import type { IFoo, IDType } from "./type/index";
    import axios from 'axios'
    import lodash from 'lodash'
    lodash.join(['11', '22'])
    
    const id: IDType = 12121212121
    const foo: IFoo = {
      name: 'foo',
      age: 18
    }
    
  • declare声明文件:

    • 比如在开发vue的过程中,默认是不识别.vue文件的,那么就需要对其进行文件的声明
      在这里插入图片描述

    • 比如在开发中使用了 jpg 这类图片文件,默认typescript也是不支持的,也需要对其进行声明
      在这里插入图片描述

    // XXX.d.ts
    declare module 'lodash' {
      export function join(args: any[]): any
    }
    
    declare module '*.vue' {
      import { DefineComponent } from 'vue'
      const component: DefineComponent
      export default component
    }
    
    declare module '*.jpg' {
      const src: string
      export default src
    }
    
  • declare命名空间:
    比如在index.html中直接引入了jQuery:https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js 可以进行命名空间的声明
    在这里插入图片描述

    // XXX.d.ts
    declare module 'lodash' {
      export function join(args: any[]): any
    }
    
    declare module '*.vue' {
      import { DefineComponent } from 'vue'
      const component: DefineComponent
      export default component
    }
    
    declare module '*.jpg' {
      const src: string
      export default src
    }
    
    declare namespace $ {
      function ajax(setting: any): void
    }
    

tsconfig.json文件

当目录中出现了 tsconfig.json 文件,则说明该目录是 TypeScript 项目的根目录,tsconfig.json文件指定了编译项目所需的根目录下的文件以及编译选项

tsconfig.json文件有两个作用:

  • 作用一:让TypeScript Compiler在编译的时候,知道如何去编译TypeScript代码和进行类型检测

  • 作用二:让编辑器(比如VSCode)可以按照正确的方式识别TypeScript代码,对于哪些语法进行提示、类型错误检测等等

tsconfig.json在编译时如何被使用呢?

  • 在调用 tsc 命令并且没有其它输入文件参数时,编译器将由当前目录开始向父级目录寻找包含 tsconfig 文件的目录

  • 调用 tsc 命令并且没有其他输入文件参数,可以使用 --project (或者只是 -p)的命令行选项来指定包含了 tsconfig.json 的目录

  • 当命令行中指定了输入文件参数,tsconfig.json 文件会被忽略

tsconfig.json文件包括哪些选项呢?

  • tsconfig.json本身包括的选项非常非常多,不需要每一个都记住

  • 可以查看文档对于每个选项的解释:https://www.typescriptlang.org/tsconfig

  • 当开发项目的时候,选择TypeScript模板时,tsconfig文件默认都会配置好

  • 下图是常见的一些配置:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在Vue项目中应用

具体学习这篇文章:待后面补充

在React项目中应用

具体学习这篇文章:待后面补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/894490.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b

【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b CogVideoX-2b 模型介绍发布时间模型测试生成的demo视频生成视频限制 运行环境安装运行模型下载开源协议参考 CogVideoX-2b 模型介绍 CogVideoX是 清影 同源的开源版本视频生成模型。 基础信息: 发布时间 2…

VScode远程服务器进行开发(三)

VScode远程服务器进行开发(三) 1、配置你的~/.ssh/config文件 在家目录中配置 ~/.ssh/config 文件,没有配置过的同学可以自行百度,基本上就是远程服务器的罗列; 同时,在你安装了 Remote Development 后&…

群晖使用Docker搭建NASTool自动化观影工具并实现在线远程管理

文章目录 前言1. 本地搭建Nastool2. nastool基础设置3. 群晖NAS安装内网穿透工具4. 配置公网地址5. 配置固定公网地址 前言 本文主要分享一下如何在群晖NAS中本地部署Nastool,并结合cpolar内网穿透工具,轻松实现公网环境远程管理与访问本地NAS中储存的影…

“网络协议入门:HTTP通信的四大组成部分“

White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🐹今日诗词: 春水满四泽,夏云多奇峰🐹 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏 ⛳️点赞 ☀️收藏⭐️关注💬卑微…

大话设计模式解读07-模板方法

上篇文章,介绍了《大话设计模式》的第9章——原型模式。 本篇,来介绍《大话设计模式》的第10章——模板方法。并通过C代码实现实例代码的功能。 1 模板方法 模板方法模式(TemplateMethod):定义一个操作中的算法的骨架…

【简单版】通过 Window.performance 实现前端页面(性能)监控

1 背景 前端监控系统告警xx接口fetchError 问题:前端监控系统没有更多的错误信息,查询该fetch请求对应的接口日志返回200状态码、无请求异常记录,且后台能查到通过该fetch请求成功发送的数据。那是前端页面的错误还是前端监控系统的问题&…

如何轻松使用pip安装Git仓库中的私有Python模块(使用pip和Git仓库发布和安装私有Python模块)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Git模块 📒📝 Git仓库要求🔖 项目目录结构🔖 文件说明📝 编写setup.py📝 配置MANIFEST.in📝 推送代码到Git仓库📝 使用pip安装模块🔖 使用用户名和密码🔖 使用Personal Access Token (PAT)🔖 示例📝 更…

基于SpringBoot的在线数据平台设计与实现(源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

Apache Lucene 10 已发布!Lucene 硬件效率改进及其他改进

作者:来自 Elastic Adrien Grand Apache Lucene 10 刚刚发布,重点关注硬件效率!查看主要版本亮点。 Apache Lucene 10 终于发布了!自 Lucene 9.0(于 2021 年 12 月发布,距今已有近 3 年)以来&a…

Faster RCNN

经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在2016年提出了新的Faster RCNN,在结构上,Faster RCNN已经将特征抽取(feature extraction),proposal提取,bounding box regression(rect refine),classificati…

医疗领域的RAG技术:如何通过知识图谱提升准确性

在医学领域,准确的信息检索和处理至关重要。随着大型语言模型(LLMs)的兴起,检索增强生成(RAG)技术在医学信息处理中的应用越来越受到关注。本文将探讨RAG技术在医学领域的应用,特别是如何利用知…

【wpf】07 后端验证及令牌码获取步骤

由于在用wpf开发应用程序时,从后端获取数据需要用到 Authorization 授权的Bearer令牌,而这个令牌的获取需要登录后台进行获取,这里登录时还涉及到的验证码的操作,所以在获取过程中,需要对后台系统进行登录并拿到这个Be…

潮流头像社 1.1 | 打造个性化专属头像的设计工具。

潮流头像社提供了丰富多样的头像制作工具和素材,让用户可以尽情地展示自己的独特魅力。无论是想要换脸特效、滤镜、贴纸、文字还是配饰,用户都可以在这里找到自己喜欢的元素,并且将其融合到自己的头像设计中,创造出一个独一无二的…

87. 多边形轮廓Shape(圆弧)

先掌握上节课关于Shape内容,再继续学习本节课关于Shape圆弧的介绍。 圆弧方法.arc() 圆弧方法.arc()使用方式和原来学习过的圆弧曲线ArcCurve整体相似,区别在于圆心定位方式有差异。 圆弧.arc()参数的圆心坐标是相对当前.currentPoint而言,而不是坐标原…

MFC工控项目实例二十五多媒体定时计时器

承接专栏《MFC工控项目实例二十四模拟量校正值输入》 用多媒体定时器实现0.1秒计时器 1、在SEAL_PRESSUREDlg.h文件中添加代码 #include<MMSystem.h> #pragma comment(lib,"winmm.lib")class CSEAL_PRESSUREDlg : public CDialog { public:CSEAL_PRESSUREDlg(…

【动态规划】【斐波那契数列模型】三步问题、第N个泰波那契数、使用最小花费爬楼梯

模板 算法原理 做动态规划的题目&#xff0c;一般会先创建一个一维数组 dp&#xff0c;称之为 dp表我们想办法填满这个 dp表&#xff0c;里面的某个值就是最终结果 采用动态规划&#xff0c;一般分五步&#xff1a; 状态表示 是什么&#xff1f; dp 表中每一个值所表示的含义…

王爽汇编语言第三版实验3

实验任务 将下面的程序保存为t1.asm&#xff0c;将其生成可执行文件t1.exe 用Vscode编写源程序t1.asm 用脚本一键生成可执行文件t1.exe 成功运行 查看资源管理器&#xff0c;成功生成T1.obj与t1.exe文件‘ 用debug跟踪t1.exe的执行过程&#xff0c;写出每一步执行后&#xff…

基于SSM的大学校医院信息管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着高校规模的不断扩大和师生健康意识的增强&#xff0c;大学校医院面临着日益增长的医疗服务需求。传统的纸质病历、手工预约和药品管理方式已难以满足高效、准确和便捷的服务要求。因此&#xff0c;开发一套基于SSM&#xff…

021_Thermal_Transient_in_Matlab统一偏微分框架之热传导问题

Matlab求解有限元专题系列 固体热传导方程 固体热传导的方程为&#xff1a; ρ C p ( ∂ T ∂ t u t r a n s ⋅ ∇ T ) ∇ ⋅ ( q q r ) − α T d S d t Q \rho C_p \left( \frac{\partial T}{\partial t} \mathbf{u}_{\mathtt{trans}} \cdot \nabla T \right) \nab…

[计算机网络]第一周

TCP/IP 与OSI TCP/IP TCP/IP 四层模型是一个分层网络通信模型&#xff0c;它将网络通信过程分为四个层次&#xff0c;这四层分别是&#xff1a;网络接口层、互联网层、传输层和应用层。 网络接口层负责在计算机和网络硬件之间传输数据&#xff0c;负责在物理网络上发送和接收…