TypeScript 第三部分 扩展

news2024/10/6 19:54:13

1. 声明文件

  • 主要作用:
    1. 类型声明:为库或模块提供类型信息。
    2. 全局声明:为全局作用域中的类型和变量提供声明。
    3. 类型兼容性:确保第三方库或自定义代码的类型正确性。
    4. 代码提示与检查:在开发环境中提供更好的代码提示和类型检查。
      通过使用 .d.ts 文件,可以显著提高 TypeScript 项目的类型安全性和开发体验。
  1. .d.ts文件

    称为类型声明类型定义文件

    • .d.ts文件的来源
      1. 内置。例如:typescript包中自带的ES6的声明文件
      2. 第三方库。通过npm安装的包里面
      3. 自定义。自己写的.d.ts文件
  2. 第三方库的声明文件
    • 库中本身包含声明文件,例如:axios通过import axios from "axios"; 就可以引入
    • 如果第三方库中没有包含声明文件,可以去yarn官网查找,推荐使用yarn包管理工具
    • 自定义第三方库的声明文件

2. 自定义声明文件

  • 声明文件的文件后缀:.d.ts
  • 关键字declare 用于声明全局变量、类型、函数、类或模块,告诉TypeScript编译器这些声明已经存在于运行时环境中。

declaretype和interface的区别:

  • type和interface重点在于结构,某一个变量、函数、类的结构
  • declare重点在于告诉整个项目,某一个变量、类、模块存在,让ts可以识别,同时说明它们是什么类型,有什么方法、属性可以使用

1. 声明常量、变量、函数、类

  • 在什么情况下需要声明
    • 假设main.ts想要使用index.js文件中的数据,通常我们使用import来导入index.js文件便于使用index.js文件中的数据。
    • 那么现在就不使用import,假设在一个html文件<script>中引入了index.jsmain.ts两个文件,虽然这两个文件都被引入了同一个html文件中,但是main.ts并不知道index.js 有什么类型的数据,根本无法使用,这时候需要.d.ts文件来声明index.js文件中的数据,声明后main.ts文件中就可以使用了
    • 总结:已经知道有一个可以使用的数据(数据的结构可以是常量、变量。。。),多个ts文件想要使用,或者说没有必要引入,就可以使用声明的方式来使用
  • 声明文件
// 声明变量
declare let userName: string;
// 声明常量
declare const OK: boolean
// 声明函数
declare function getInfo(id: number): string;
// 声明类
declare class User {
  constructor(public id: number, public name: string);
} 
  • index.js文件中的内容
const OK = true // 常量

let userName = 'zhangsan'	// 变量
function getInfo(id){	// 函数
  return 'lisi'
}
function User(id, name){	// 类
  this.id = id
  this.name = name
}
  • main.ts文件
// 使用变量
console.log(userName)
// 使用常量
console.log(OK)
// 使用函数
console.log(getInfo(1))
// 类
const user = new User(1, 'zhangsan')
console.log(user)
  • 结果
zhangsan
true
lisi
User {id: 1, name: 'zhangsan'}

2. 声明资源类文件

示例:导入图片

  • 声明文件
// 声明文件模块
declare module "*.png"
declare module "*.jpg"
declare module "*.jpeg"
declare module "*.gif"
  • mani.ts
import meiNv from './assets/111.jpg' // 如果没有声明.jpg文件,这里报错
const dom = document.createElement('img')
dom.src = meiNv
document.body.appendChild(dom)

// 导入图片需要在webpackconfig.js中配置打包规则
module: {
  rules: [
   {
     test: /\.(png|svg|jpg|jpeg|gif)$/i,
     type: 'asset/resource',
   },
  ]
}

3. 声明模块

  • 用法略有不同,声明的模块需要使用import导入
// 声明模块,重点在于模块中所导出的东西,说明在这个模块中有些什么东西可以使用
declare module "myModule" {
  export function foo(): void; // 模块中的函数
  export const bar: number; // 模块中的常量
  export class Foo {} // 模块中的类
}
  • main.js
import myModule from "myModule"; // 引入模块

myModule.foo();	// 使用模块中的数据
myModule.bar = 20
new myModule.Foo()

4. 声明文件

  • 使用import App from './App.vue'时会报.vue类型错误,因为ts不认识.vue文件,所以声明.vue文件是DefineComponent类型,这样就不会报错了
// 声明'.vue'文件
declare module ".vue" {
	import { DefineComponent } from 'vue'
	const component: DefineComponent
	export default component
}

3. tsconfig.json

1. 作用

  • 让tsc编译代码的时候,知道如何去编译ts文件同时做类型检测
    • 比如是否允许不明确的this选项,是否允许含有隐式的any类型
    • 编译后的js代码是什么版本?ES3、ES5?
  • 编辑器同时也在读取该文件,用于代码检测,提示错误
  • 有该文件的目录,会被识别为ts项目的根目录

2. 在编译时如何被使用

  • 在命令行输入tsc命令,会在目录中寻找tsconfig.json文件,读取到配置后,会将该目录下的所有ts文件按照config中的配置编译为js文件
    • 如果tsc后面加了参数或者文件名,则tsc不会读取config文件
  • webpack使用ts-loader进行打包时,读取config文件,根据config中的配置来编译ts文件

3. tsconfig中的配置项

官网介绍链接

"module": "commonjs"	// 最终生成的代码使用的模块化
"esModuleInterop": true,   // es module 和 commonjs可以互相调用,有些库使用commonjs,而我们的项目使用es module,在项目中可以使用import导入commonjs
"strict": true, 	// 严格的类型检测
"skipLibCheck": true      // 是否跳过.d.ts文件中的类型检测
"allowJs": true, 	// 是否允许在ts文件中使用js代码
"jsx": "preserve", 	// jsx的处理方式(preserve:保留原有的jsx格式)
"importHelpers": true,  // 是否导入一些需要的功能模块
"moduleResolution": "node10",	// 在import ··· from 'XXX' 时,指定查找XXX的规则
"allowSyntheticDefaultImports": true
/*  导出时:export {aa, bb, cc}
	导入时:import * as x from 'index.js' 使用时:x.aa x.bb 
如果配置为 true
  可以使用:import x from 'index.js' 写法 
*/
"sourceMap": true, 	// 是否生成映射文件
// 作用:在ts文件与编译好的js文件之间做映射,可以方便的查找报错后对应的ts代码的位置
"baseUrl": ".", // 设置基本路径,基本路径设置为当前项目的根目录,如不设置,默认指定的也是根路径
"paths": {
  "@/*": ["src/*"]  // 设置路径别名,"src/*"是从根路径开始,根路径是baseUrl指定的
}

搭建webpack环境

在html页面中运行javascript

  • node项目初始化
pnpm init -y
  • 安装webpack及相关插件
pnpm add webpack webpack-cli webpack-dev-server -D
  • 安装ts-load,并初始化ts配置文件
// 初始化ts环境,无法执行,需要全局安装typescript
tsc --init
// 全局安装typescript
pnpm install tapyescript -g

// 安装ts-load,webpack中
  • 安装html-webpack-plugin
pnpm add html-webpack-plugin -D
  • package.json
{
  "name": "ts-webpack",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "dev": "webpack server --mode development --open --hot"
  },
  "author": "",
  "license": "ISC",
  "description": "",
  "devDependencies": {
    "html-webpack-plugin": "^5.6.0",
    "ts-loader": "^9.5.1",
    "webpack": "^5.95.0",
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^5.1.0"
  }
}
  • webpack.config.js
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const config = {
  mode: "development",
  entry: "./src/index.ts",//入口文件
  output: {// build时,打包目录
    filename: "bundle.js",
    path: path.resolve(__dirname, "./dist"),
  },
  resolve: { // import 这些文件时,可以省略后缀
    extensions: [".json", ".ts", ".js","cjs"],},
  module: {
    rules: [
      // 以.ts结尾的文件,指定使用ts-loader加载器来处理
      {
        test: /\.ts$/,
        loader: "ts-loader",
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({ //把入口文件编译成js后注入到指定的模板文件的,指定位置,这里指定的是body
      template: "./index.html", // 指定模板文件
      filename: "index.html", // 输出文件名
      inject: "body", // 注入的位置,
    }),
  ],
};

module.exports = config;
  • 目录结构
    在这里插入图片描述

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

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

相关文章

Sollong手机——一站式Web3生态解决方案

从定义上讲&#xff0c;Web3公司也属于互联网公司&#xff0c;不过与传统互联网公司相比&#xff0c;他们有一个很明显的特征&#xff1a;他们不断尝试做去中心化的事&#xff0c;一步步将数据和金融的控制权从美联储&#xff08;央行和金融机构&#xff09;、苹果&#xff08;…

2024/10/6周报

文章目录 摘要Abstract广西的一些污水处理厂工艺解析1. A/O工艺&#xff08;厌氧-缺氧-好氧工艺&#xff09;2. 氧化沟工艺3. MBR工艺&#xff08;膜生物反应器&#xff09;4. SBR工艺&#xff08;序批式活性污泥法&#xff09;5. 生物接触氧化法 其它补充一体化改良氧化沟工艺…

Linux的基础指令(下)

压缩包 这里不为打包和压缩做仔细的区分&#xff1b; 打包&#xff1a; 文件合并&#xff1b; 主要目的是在文件传输&#xff0c;移动时&#xff0c;能有效减少文件的缺失&#xff1b; 压缩&#xff1a;为了减小文件体积&#xff0c;内存&#xff1b; 主要目的是减小使用体…

在JS中定义和使用Vector2

概述 Vector2是GDSCript中表示二维向量的类型&#xff0c;你会发现无论在任何编程语言中&#xff0c;只要你想很好的实现2D绘图以及几何和物理相关&#xff0c;Vector2是你必须要实现的一个类。我之前学C时就写过一个C的版本。 本篇就介绍我自己在JavaScript中定义的Vector2类…

基于ssm 框架的java 开发语言的 在线教育学习平台系统设计与实现 源码 论文

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆…

AI周报(9.29-10.5)

AI应用-Elayne公司临终规划和自动化遗产结算 创业公司Elayne成立于2023年&#xff0c;由Adria Ferrier和Jake Grafenstein共同创立&#xff0c;Adria Ferrier担任CEO&#xff0c;总部位于科罗拉多州丹佛市。 Elayne公司专注于遗产规划和结算领域&#xff0c;通过人工智能技术…

实验4 循环结构

1、判断素数 【问题描述】从键盘输入一个大于1的正整数&#xff0c;判断是否为素数 【输入形式】输入一个正整数 【输出形式】输出该数是否为素数 【样例输入】10 【样例输出】10 is not a prime number 【样例说明】样例2 输入&#xff1a;-10 输出&#xff1a;error! #de…

实景三维赋能矿山安全风险监测预警

随着科技的不断进步&#xff0c;实景三维技术在矿山安全风险监测预警中的应用越来越广泛&#xff0c;它为矿山安全管理带来了革命性的变革。 一、矿山安全现状 矿山作为国家重要的能源和原材料基地&#xff0c;其安全生产直接关系到国民经济的发展和社会的稳定。然而&#xf…

【前端vue2 + element ui】Dialog 对话框:.vue组件跳转

【前端vue2 element ui】Dialog 对话框&#xff1a;.vue组件跳转 写在最前面一、父组件调用1、<template>1.1 跳转位置1.2 弹窗调用 2、<script>2.1 import2.2 export2.3 methods 二、子组件调用1、<template>2、<script>2.1 export2.2 watch和method…

不可错过!CMU最新《生成式人工智能大模型》课程:从文本、图像到多模态大模型

1. 课程简介 从生成图像和文本到生成音乐和艺术&#xff0c;生成模型一直是人工智能的关键挑战之一。本课程将探讨推动生成模型和基础模型&#xff08;Foundation Models&#xff09;最近进展的机器学习和人工智能技术。学生将学习、开发并应用最先进的算法&#xff0c;使机器…

windows下,在vscode中使用cuda进行c++编程

安装cuda CUDA Toolkit Downloads | NVIDIA Developer 这里网上教程多的是&#xff0c;在这个网址下载安装即可 我这台电脑因为重装过&#xff0c;所以省去了安装步骤&#xff0c;但是要重新配置环境变量。我重新找到了重装之前的CUDA位置(关注这个bin文件夹所在的目录) 在…

Canvas指纹:它是什么以及如何避免被Canvas指纹识别跟踪

Canvas指纹识别技术已成为追踪在线行为的一种隐蔽手段。尽管这个技术在某些方面有其正当用途&#xff0c;它也可能被用于监视我们的在线活动&#xff0c;不经我们的同意就收集个人信息。 你认为启用Canvas指纹禁用功能就能使你在网络上无迹可寻吗&#xff1f;可能需要重新考虑…

开放式耳机是什么意思?漏音吗?开放式的运动蓝牙耳机推荐

目前运动耳机市场主要分为入耳式、骨传导和开放式三类。入耳式耳机占比30%-40%&#xff0c;虽目前占比较大&#xff0c;但因在运动场景下有闷塞感、出汗不适、屏蔽外界环境音带来安全隐患等缺点&#xff0c;占比会逐渐下降。 骨传导耳机占比也为30%-40%&#xff0c;其不堵塞耳…

macos 中使用macport安装,配置,切换多版本php,使用port 安装php扩展方法总结

macport是一款mac系统中比较优秀的软件包管理工具&#xff0c;他与brew的最大区别在于软件包的安装速度相当的快&#xff0c;以安装php为例&#xff0c; 使用port安装和使用brew安装&#xff0c;port方式安装要比brew方式安装要快最少10倍以上&#xff0c; 因为port安装软件包时…

javaScript数组(16个案例+代码+效果图)

目录 1.数组的概念 2.创建数组 1.通过数组字面量创建数组 1.代码 2.效果 2.通过new Array()创建数组 1.代码 2.效果 3.数组的基本操作 1.获取数组的长度 案例:获取数组的长度 1.代码 2.效果 2.修改数组的长度 1.代码 2.效果 4.访问数组 案例:访问数组 1.代码 2.效果 5.遍历数组…

实验3 选择结构

1、计算分段函数的值 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h> int main() {double x,y0;scanf("%lf",&x);if(x<0){printf("error!\n");return 0;}if(0<x&&x<1){ylog10(x);}else if(1<…

第十四周:机器学习

目录 摘要 Abstract 一、生成式对抗网络&#xff08;下&#xff09; 1、回顾 2、生成式模型 3、generative评价指标 4、conditional generation 5、cycle GAN 二、总结 摘要 接着上周对GAN的初步概念了解及其理论推导&#xff0c;本周回顾了GAN难以训练的问题&#…

常见排序详解(历时四天,哭了,必须释放一下)

目录 1、插入排序 1.1 基本思想 1.2 直接插入排序 1.2.1 思路 1.2.2 代码实现 1.2.3 性质 1.3 希尔排序 1.3.1 思路 1.3.2 代码实践 1.3.3 性质 2、选择排序 2.1 基本思想 2.2 直接选择排序 2.2.1 思路 2.2.2 代码实践 2.2.3 性质 2.3 堆排序 2.3.1 思路 2.…

No.5 笔记 | 网络端口协议概览:互联网通信的关键节点

1. 常用端口速览表 端口范围主要用途1-1023系统或特权端口1024-49151注册端口49152-65535动态或私有端口 远程访问类&#xff08;20-23&#xff09; 端口服务记忆技巧安全风险21FTP"File Transfer Port"爆破、嗅探、溢出、后门22SSH"Secure Shell"爆破、…

基于 STM32F407 的 SPI Flash下载算法

目录 一、概述二、自制 FLM 文件1、修改使用的芯片2、修改输出算法的名称3、其它设置4、修改配置文件 FlashDev.c5、文件 FlashPrg.c 的实现 三、验证算法 一、概述 本文将介绍如何使用 MDK 创建 STM32F407 的 SPI Flash 下载算法。 其中&#xff0c;SPI Flash 芯片使用的是 W…