理解TypeScript模块-声明-配置

news2024/10/23 20:23:59

目录

  • 模块化
  • 内置类型导入
  • 命名空间
  • 类型查找
  • 内置类型
  • 外部定义声明
    • 第三方库
    • 自定义声明
  • `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项目中应用

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何利用 Python抓取网页数据 其他方式抓取网页数据列举

在 Python 中可以使用多种方法抓取网页数据,以下是一种常见的方法,使用requests和BeautifulSoup库。 一、安装所需库 在命令提示符或终端中执行以下命令安装requests和BeautifulSoup库: pip install requests pip install beautifulsoup4二…

Spring Boot论坛网站开发:最佳实践指南

3系统分析 3.1可行性分析 通过对本论坛网站实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本论坛网站采用SSM框架,JAVA作为开发语言,是…

使用 Cursor 和 Devbox 快速开发并上线 Gin 项目

作为开发者,最让我们头疼的事情是什么?那必须是环境配置、版本控制以及各种部署配置等等繁琐的工作。 想象一下,如果你只需点击几下鼠标,就能拥有一个完全配置好的开发环境,支持从 Java 到 Python,从 Reac…

[实时计算flink]作业开发上线流程及规范

随着数据量的爆炸性增长和业务需求的日益复杂化,企业对实时数据处理能力的需求愈发迫切。Flink作为一种强大的流处理框架已经成为实时计算标准,其规范化的开发和运维流程对于企业提升数据处理效率、确保系统稳定性至关重要,旨在提升研发效率&…

电商大数据获取渠道分享--官方接口、爬虫、第三方如何选择?

在当今大数据驱动的商业环境中,电商企业越来越依赖数据分析来洞察市场、优化运营和提升竞争力。本文将分享几种常见的电商大数据获取渠道,帮助电商从业者更有效地收集和利用数据资源。 一、电商平台官方接口 各大电商平台如淘宝、京东、拼多多等&#…

DML语言

DML(数据操作语言) 用于操作数据库对象中所包含的数据 包括: INSERT ( 添加数据语句 ) UPDATE ( 更新数据语句 ) DELETE ( 删除数据语句 ) INSERT ( 添加数据语句 ) INSERT INTO 表名 [ ( 字段1, 字段2, 字段3, … ) ] VALUES ( 值1, 值2,…

计算机网络-RSTP工作过程与原理

前面我们已经学习了RSTP的一些基础概念以及对于STP的改进之处,因为RSTP兼容STP,所以实际上两者工作原理是一致的,这里只简单过一遍,然后进行一些基础实验即可,大致还是遵循选举根桥、确定端口角色与状态、全网收敛的思…

CentOS 8 Stream环境下通过yum安装Mysql

1.在Mysql下载页面MySQL :: Download MySQL Community Server页尾 点击 “MD5 checksums and GnuPG signatures” 进入下一页面 2.打开下载yum repo文件页面 (MySQL :: Download MySQL Yum Repository) 3.点击"DownLoad"按钮,打开下载页面, 4.…

GB/T28181-2022规范解读、应用场景和技术实现探究

GB/T28181-2022和GB/T28181-2016区别 GB/T28181-2022《公共安全视频监控联网系统信息传输、交换、控制技术要求》与 GB/T28181-2016 相比,主要有以下区别: 术语和定义方面: 术语删减:GB/T28181-2022 删除了 “联网系统信息”“数…

大模型LLM学习路线图2024年最新版!全面掌握学习路径,非常详细,零基础想学大模型收藏这一篇就够了

ChatGPT的出现在全球掀起了AI大模型的浪潮,2023年可以被称为AI元年,AI大模型以一种野蛮的方式,闯入你我的生活之中。 从问答对话到辅助编程,从图画解析到自主创作,AI所展现出来的能力,超出了多数人的预料&…

【redis】redis的多线程和IO多路复用

【redis】redis的多线程和IO多路复用 【一】前言【二】Redis单线程和多线程问题的背景【1】Redis的单线程【2】Redis为什么选择单线程?【3】Redis为什么开始利用多核?【4】Redis当前的性能瓶颈【5】Redis的主线程如何和IO线程协同 【三】IO多路复用的理解…

【Trick】IOS系统解决“未受信任的企业级开发者”问题

问题: 本人通过扫码下载了一个软件,下载完毕后出现以下提示: 解决方法: 这个主要是操作系统的问题,需要在设置里面更改,具体步骤如下: 【1】打开设置,选择【通用】 【2】选择【VP…

千鹿 AI ——AI一键生成模特上身图,零成本制作服装电商图片,AI换模特/背景/批量抠图,一个网站就够了!

前言 在电商行业,卖产品主要是卖图片。拍一套产品图加上美工费用,基本要大几百上千,对新手卖家是不小的支出。服装类目的 SKU 很多,一个链接下有几十个款式很常见。 AI 出现对跨境电商有好处是大家都知道的。现在看看电商领域的…

rust aarch64开发-编译

1. 实验代码下载 本实验基于github或gitee上的开源实现。 // 无法访问github可以通过如下地址下载 git clone https://gitee.com/yang_jun_yi/armv8-rust-hypervisor.git // github下载 git clone https://github.com/Comet959/armv8-rust-hypervisor.git2. 编译 make start…

PG实践|数学函数及其操作(一)

文章目录 引言1.1 ABS() - 取绝对值1.2 CEIL() 或 CEILING() - 向上取整1.3 FLOOR() - 向下取整1.4 ROUND() - 四舍五入1.5 TRUNC() - 截断/截取小数总结 📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程…

Spring配置/管理bean-IOC(控制反转) 非常详细!基于XML及其注解!案例分析! 建议复习收藏!

目录 1.Spring配置/管理bean介绍 2.基于XML配置bean 2.1基于id来获取bean对象 2.2基于类型获取bean对象 2.3通过指定构造器配置bean对象 2.4通过p名称空间配置bean 2.5通过ref配置bean(实现依赖注入) 2.6注入内部Bean对象,依赖注入另一种方式 2.7 注入集合…

AWD的复现

学习awd的相关资料:速成AWD并获奖的学习方法和思考记录- Track 知识社区 - 掌控安全在线教育 - Powered by 掌控者(包含使用脚本去批量修改密码) 在复现之前去了解了以下AWD的相关脚本 资料:AWD批量攻击脚本使用教程-CSDN博客 …

网络安全有关法律法规

1. 前言 在当今数字化高速发展的时代,网络安全已成为关乎国家、企业和个人的重要议题。为了应对日益复杂的网络安全挑战,一系列网络安全法律法规应运而生,它们如同坚实的盾牌,守护着我们的数字世界。现在是2024年10月&#xff0c…

军团服务QA角度总结

需求背景: 军团业务诞生的时候承接家族群组功能,玩法邀请成员做任务->积分升级->发送奖励。还是拉收入的一个业务载体。收入才是王道。 军团服务端核心就三个:军团创建,人员管理和军团奖励。 军团创建: 创建…

每天练打字8:今日状况——常用字后五百击键4.5第1遍进行中,赛文速度105.75

今日跟打:738字 总跟打:125701字 记录天数:2459天 (实际没有这么多天,这个是注册账号的天数) 平均每天:50字 本周目标完成进度: 练习常用单字后500,击键3.5,…