TypeScript(五)知识扩展

news2024/9/22 9:50:41

TypeScript

TypeScript模块化

JavaScript 有一个很长的处理模块化代码的历史,TypeScript 从 2012 年开始跟进,现在已经实现支持了很多格式。但是随着
时间流逝,社区和 JavaScript 规范已经使用为名为 ES Module的格式,这也就是我们所知的 import/export 语法。
ES 模块在 2015 年被添加到 JavaScript 规范中,到 2020 年,大部分的 web 浏览器和 JavaScript 运行环境都已经广泛支持。
所以在TypeScript中最主要使用的模块化方案就是ES Module;

export function add(num1: number, num2: number) {
	return num1 + num2
}

在前面我们已经学习过各种各样模块化方案以及对应的细节,这里我们主要学习TypeScript中一些比较特别的细节。

非模块(Non-modules)

我们需要先理解 TypeScript 认为什么是一个模块。
JavaScript 规范声明任何没有 export 的 JavaScript 文件都应该被认为是一个脚本,而非一个模块。
在一个脚本文件中,变量和类型会被声明在共享的全局作用域,将多个输入文件合并成一个输出文件,或者在 HTML使用多个

export {}

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

内置类型导入(Inline type imports)

TypeScript 4.5 也允许单独的导入,你需要使用 type 前缀 ,表明被导入的是一个类型:

import { type IFoo, type IDType } from './foo'

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

这些可以让一个非 TypeScript 编译器比如 Babel、swc 或者 esbuild 知道什么样的导入可以被安全移除。

命名空间namespace(了解)

TypeScript 有它自己的模块格式,名为 namespaces ,它在 ES 模块标准之前出现。
命名空间在TypeScript早期时,称之为内部模块,目的是将一个模块内部再进行作用域的划分,防止一些命名冲突的问题;
虽然命名空间没有被废弃,但是由于 ES 模块已经拥有了命名空间的大部分特性,因此更推荐使用 ES 模块,这样才能与
JavaScript 的(发展)方向保持一致。

export namespace Time {
	export function format(time: string) {
		return '2022-11-24'
	}

	export const name = 'tiem'
}

类型的查找

之前我们所有的typescript中的类型,几乎都是我们自己编写的,但是我们也有用到一些其他的类型:

const imageEl = document.getElementById('image') as HTMLImageElement

大家是否会奇怪,我们的HTMLImageElement类型来自哪里呢?甚至是document为什么可以有getElementById的方法呢?
其实这里就涉及到typescript对类型的管理和查找规则了。

我们这里先给大家介绍另外的一种typescript文件:.d.ts文件
我们之前编写的typescript文件都是 .ts 文件,这些文件最终会输出 .js 文件,也是我们通常编写代码的地方;
还有另外一种文件 .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。
在这里插入图片描述

内置声明的环境

我们可以通过target和lib来决定哪些内置类型声明是可以使用的:
例如,startsWith字符串方法只能从称为ECMAScript 6的 JavaScript 版本开始使用;
我们可以通过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(老版本)
情况二:我们给自己的代码中声明一些类型,方便在其他地方直接进行使用;

let name = 'kobe'
let age = 18
let height = 1.88

function Foo() {
	console.log('foo')
}

declare let name: string
declare let age: number
declare let heigth: number

declare function Foo(): void

declare class Person {
	name: string
	age: number

	constructor(name: string, age: number)
}

declare声明模块

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

declare module 'ldash' {
	export function join(args: any[]): any
}

声明模块的语法: declare module ‘模块名’ {}。
在声明模块的内部,我们可以通过 export 导出对应库的类、函数等;

declare 声明文件

在某些情况下,我们也可以声明文件:
比如在开发vue的过程中,默认是不识别我们的.vue文件的,那么我们就需要对其进行文件的声明;
比如在开发中我们使用了 jpg 这类图片文件,默认typescript也是不支持的,也需要对其进行声明;

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:
CDN地址: https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js
我们可以进行命名空间的声明:

declare namespace $ {
	function agex(settings: any):void
}

在main.ts中就可以使用

$.ajax({
	url:'xxx',
	success: (res: any) => {
		console.log(res)
	}
})

认识tsconfig.json文件

什么是tsconfig.json文件呢?(官方的解释)
当目录中出现了 tsconfig.json 文件,则说明该目录是 TypeScript 项目的根目录;
tsconfig.json 文件指定了编译项目所需的根目录下的文件以及编译选项
官方的解释有点“官方”,直接看我的解释。
tsconfig.json文件有两个作用:

作用一(主要的作用):让TypeScript Compiler在编译的时候,知道如何去编译TypeScript代码和进行类型检测;
比如是否允许不明确的this选项,是否允许隐式的any类型;
将TypeScript代码编译成什么版本的JavaScript代码;

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

JavaScript 项目可以使用 jsconfig.json 文件,它的作用与 tsconfig.json 基本相同,只是默认启用了一些 JavaScript 相关的
编译选项。
在之前的Vue项目、React项目中我们也有使用过;

tsconfig.json配置

tsconfig.json在编译时如何被使用呢?
在调用 tsc 命令并且没有其它输入文件参数时,编译器将由当前目录开始向父级目录寻找包含 tsconfig 文件的目录。
调用 tsc 命令并且没有其他输入文件参数,可以使用 --project (或者只是 -p)的命令行选项来指定包含了 tsconfig.json 的
目录;
当命令行中指定了输入文件参数, tsconfig.json 文件会被忽略;

tsconfig.json文件包括哪些选项呢?
tsconfig.json本身包括的选项非常非常多,我们不需要每一个都记住;
可以查看文档对于每个选项的解释:https://www.typescriptlang.org/tsconfig
当我们开发项目的时候,选择TypeScript模板时,tsconfig文件默认都会帮助我们配置好的;
接下来我们学习一下哪些重要的、常见的选项。

tsconfig.json顶层选项

complierOptions : 编译器选项
files: 编写一个数组 用于指定项目中包括那些文件 通常当项目中文件比较少时 可以使用这个选项
include: 编写一个数组 用于指定项目中包括那些文件 默认匹配的是根目录下的所有文件
手动指定 “include”: [“src // *", "tests//*”]
exclude: 编写一个数组 用于指定从include中排除那些文件

tsconfig.json文件

tsconfig.json是用于配置TypeScript编译时的配置选项:
https://www.typescriptlang.org/tsconfig
我们这里讲解几个比较常见的:
在这里插入图片描述在这里插入图片描述

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

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

相关文章

【Mysql】表的增删查改

文章目录前言一.表中插入数据1.1 全列增加1.2 指定列增加1.3 一次性插入多行数据1.4. 插入查询结果二.表的更新和替换2.1. 表的插入更新2.2. 替换三.表的查询3.1. 全列查询3.2. 指定列查询3.3. 查询字段为表达式并取别名3.4. 结果去重3.4. where条件3.5. 结果排序3.6. 分页查询…

【正点原子FPGA连载】第九章 按键控制LED实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第九章 按键控制…

骨传导耳机是怎么传声的?骨传导耳机到底有哪些好处?

骨传导耳机最近在网上也是越来越火了,作为一种可以开放双耳的耳机,对比一般的耳机,它可以做到开放双耳,不堵耳道,保持耳朵健康卫生。 但是随着这种耳机的逐渐崛起,很多人也对这种耳机产生了疑惑&#xff1…

正版软件|WonderFox Photo Watermark 图片水印批量处理软件

Photo Watermark 可以为您做什么?水印是最有效的方法,可防止他人擅自使用您的照片。只需单击几下,Watermark Software 将为您的图像文件提供不可磨灭的保护。 可自定义的水印 文本水印 只需按键即可创建支持丰富字体,符号&#x…

Redis进阶(主从复制、Redis集群、缓存穿透、缓存击穿、缓存雪崩)

目录 1、主从复制(读写分离) 1.1、什么是主从复制 1.2、主从复制的作用 1.3、环境搭建 1.4、一主二仆 1.5、注意事项 1.6、反客为主 1.7、哨兵模式(sentinel) 2、Redis集群 2.1、什么是集群 2.2、什么是redis集群 2.3…

报表工具使用之FineReport大数据集导出插件

1. 概述 1.1 版本 报表服务器版本 插件版本 功能变更 11.0 V1.0.0 - 11.0.10 V1.1.16 1)插件名称变更为:大数据集导出插件 2)支持导出为 CSV 类型文件 1.2 应用场景 大批量数据导出的时候,会对服务器、网络传输、数据库…

Python eval()函数详解

一、eval()函数 用来执行一个字符串表达式,并返回表达式的值。可以把字符串转化为list,dict ,tuple。 二、eval()函数源码 三、eval()函数语法 eval(*args, **kwargs) 说明: expression -- 表达式。globals -- 变量作用域,全局命名空间&…

设计模式之美——单元测试和代码可测性

最可落地执行、最有效的保证重构不出错的手段应该就是单元测试(Unit Testing)。 什么是单元测试? 单元测试由研发工程师自己来编写,用来测试自己写的代码的正确性。我们常常将它跟集成测试放到一块来对比。单元测试相对于集成测…

【PyTorch】Torchvision Models

文章目录六、Torchvision Models1、VGG1.1 add1.2 modify2、Save and Load2.1 模型结构 模型参数2.2 模型参数(官方推荐)2.3 Trap六、Torchvision Models 1、VGG VGG参考文档:https://pytorch.org/vision/stable/models/vgg.html 以VGG16为…

apache-atlas-hbase-hook源码分析

元数据类型 Hbase元数据类型, 包括命令空间、表、列族、列 public enum HBaseDataTypes {// ClassesHBASE_NAMESPACE,HBASE_TABLE,HBASE_COLUMN_FAMILY,HBASE_COLUMN;public String getName() {return name().toLowerCase();} }Hbase元数据采集实现 1)批量采集HBa…

【windows】实战部署二(使用)SVNserver服务端+SVNclient客户端

SVN服务器应用 创建版本库 1、打开VisualSVN Server: 2、建立版本库: 需要右键单击左边窗口的Repositores,在弹出的右键菜单中选择Create New Repository或者新建-Repository 3、默认选择,点击 “下一步” 按钮: Regular FSFS…

物联网安全年报漏洞情况

物联网 威胁分析漏洞篇物联网威胁分析—漏洞篇 引言 本章将从漏洞利用角度对物联网威胁进行分析。首先,我们分析了 NVD和 Exploit-DB中的物联网 年度漏洞及利用 1 变化趋势;之后统计了绿盟威胁捕获系统捕获到的物联网漏洞利用的整体情况;最…

Matlab深度学习实战一:LeNe-5图像分类篇MNIST数据集分十类且matlab提供模型框架全网为唯一详细操作流程

1.数据集简介下载与准备 2.matlab搭建模型相关知识 3.matlab软件的操作过程: (1)界面操作 (2)深度学习设计器使用 (3)图像数据导入 (4)训练可视化 一、数据集简介下载与…

mysql基本命令操作

MySQL数据库管理 SQL语句 SQL语句用于维护管理数据库,包括数据查询、数据更新、访问控制、对象管理等功能 DDL:数据定义语言,用于创建数据库对象,如库、表、索引等 DML:数据操纵语言,用于对表中的数据进行…

[附源码]计算机毕业设计JAVA民宿网站管理系统

[附源码]计算机毕业设计JAVA民宿网站管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

Android 10.0 11.0 12.0 启动模拟器教程

Android 10.0 11.0 12.0 启动模拟器教程 一、android 12.0 模拟器二、创建模拟器设备三、创建删除路经文件夹avd和配置环境变量四、启动模拟器一、android 12.0 模拟器 Android 10.0 11.0 12.0 启动模拟器都行,我选择android 12.0 模拟器 二、创建模拟器设备 第一步骤:在 …

i211网卡在Monterey及以上驱动方法

两种方法:一、驱动换成别人修改后的AppleIGB.kext。这么做一般情况用着没问题。但是如果你虚拟机桥接到这个网卡,可以获取到IP,网关等所有参数,就是不能上网 二、刷网卡固件,将i211刷成i210,直接免驱。 macos下操作 …

Brooks曾经在UMLChina网站留过言-回忆和送别(1)

(抱歉,有点标题党。) 《人月神话》作者Frederick Phillips Brooks Jr. 于2022年11月17日逝世,享年91岁。 图1 摘自 https://christianityandscholarship.org/event/making-things-ncsu-10-27-2015/ 这个岁数即使在今天也算是“…

玩转MySQL:都2022年了,这些数据库技术你都知道吗

引言 MySQL数据库从1995年诞生至今,已经过去了二十多个年头了,到2022.04.26日为止,MySQL8.0.29正式发行了GA版本,在此之前版本也发生了多次迭代,发行了大大小小N多个版本,其中每个版本中都有各自的新特性&…

亚马逊差评怎么删?常用的几种删差评方法介绍

正常情况下每个电商产品都是有好评和差评的,如果一味的都是好评,那么也显的很假,但是差评太多也会影响销售,特别是面对那些恶意差评,这会严重的影响客户下单,因此对于恶意差评,我们还是的想办法…