当前位置: 首页 > news >正文

Typescript 第十一章 与JavaScript互操作(外参变量声明,外参类型声明,外参模块声明)

第十一章 与JavaScript互操作

本章讨论在实际开发中如何编写Typescript。有可能你真正把代码从无类型语言向Typescript迁移。也有可能要使用第三方库。

  • 使用类型声明
  • 逐步从JavaScript迁移到Typescript
  • 使用第三方JavaScript和Typescript

11.1 类型声明

类型声明文件的扩展名为.d.ts。类型声明配合JSDoc注解(11.2.3节)是无类型的JavaScript代码附加Typescript类型的一种方式。( // 编译时将.d.ts类型声明一同打包"declaration": true,tsconfig.json)

类型声明的句法与常规的Typescript代码类似,不过也有几点区别:

  • 类型声明只能包含类型,不能有值。这意味着,类型声明不能实现函数,类,对象或变量,参数也不难有默认值。

  • 类型声明虽然不能定义值,但是可以声明JavaScript代码中定义了某个值,此时,使用特殊的declare关键字。

  • 类型声明只声明使用方可见的类型。如果某个代码不导出,或者是函数体内的局部变量,则不为其声明类型。

  • // a.ts
    export let a = "hhaha"
    export let b = false
    let c = [1,2]// 没有导出
    

    tsc -d a.ts的到a.d.ts

    export declare let a:string;
    epoxrt declare let b:boolean;
    
import {Subscriber} from './Subscriber'
import {Subscription} from './Subscription'
import {PartialObserver,Subscribable,TeardownLogic} from './types'export class Observable<T> implements Subscribable<T>{public _isScalar:boolean = falseconstructor(subscribe?:(this:Observable<T>,Subscriber:Subscriber<T>)=>TeardownLogic){if(subscribe){this._subscribe = subscribe}}static create<T>(subscribe?:(subscriber:Subscriber<T>)=>TeardownLogic){return new Observable<T>(subscribe)}
}

当我们使用tsc -d 文件名编译上面的代码,得到类型声明.d.ts如下

import {Subscriber} from './Subscriber'
import {Subscription} from './Subscription'
import {PartialObserver,Subscribable,TeardownLogic} from './types'export declare class Observable<T> implements Subscribable<T>{//1.public _isScalar:booleanconstructor(subscribe?:(this:Observable<T>,Subscriber:Subscriber<T>)=>TeardownLogic);static create<T>(subscribe?:(subscriber:Subscriber<T>)=>TeardownLogic):Observable<T>// 2.
}
  1. 注意,class前面有个declare关键字。在类型声明中虽然不可以真正定义类,但是却可以声明.d.ts文件对应的JavaScript文件中定义了指定的类。declare可以理解为一种断言:我肯定,我写的JavaScrip代码中导出了这个类型的类
  2. 由于类型声明中不能有具体实现,所以这里只保留了声明,没有实现的签名

注意:.d.ts文件中是.ts文件去掉实现后剩下的内容,也就是说,.d.ts只有.ts文件里的类型

这个类型声明对其他文件而言没有用,因为其他文件可以直接访问.ts,而该文件自身就是Typescript源文件。如果你在自己的Typescript应用中使用,类型声明就有用了。

如果某个npm包的开发人员想打包信息,发布到npm中供Typescript使用,有两种选择:第一,打包源文件(Typescript使用)和编译得到的JavaScript文件(JavaScript使用);第二种,提供编译后得到的JavaScript文件和供Typescript用户使用的类型声明。后一种方式所占的文件体积较小,而且十分明确。另外后一种还能减少编译应用所用的时间。

类型声明文件有以下作用:

  1. 其他人在他们的Typescript应用使用你提供的编译好的Typescript代码时,TSC会寻找与生成的JavaScript文件对应的.d.ts文件,让Typescript知道项目中涉及哪些类型。
  2. 支持Typescript的代码编辑器会读取.d.ts文件,在输入代码的过程中显示有用的提示
  3. 由于无需重新编译Typescript代码,能极大地减少编译时间。

类型声明的作用是告诉Typescript,“JavaScript文件中定义了这个,我来告诉你他的信息“类型声明描述的是外参环境,与包含值的常规声明要区分开,而常规的变量声明使用let或const关键字声明变量:

借助类型声明可以做到下面几件事:

  • 告诉Typescript,JavaScript文件中定义了某个全局变量。假如你在浏览环境中通过脚本定义了Promise或process.env,或许应该使用外参变量声明让Typescript提前知道这一点。
  • 定义在项目中任何地方都可以使用的全局类型,无须导入就能使用(这叫外参类型声明)
  • 描述通过npm安装的第三方模块(外参模块声明)

类型声明,不管作何用途,始终放在脚本模式下的.ts或.d.ts文件中。按约定,如果有对应的.js文件,类型声明文件使用.d.ts扩展名;否则,使用.ts扩展名。

类型声明文件的名称没有具体要求,例如,存储在顶层目录中的types.ts,除非内容多到不可控,一个类型声明文件中可以有任意多个类型声明。

最后要注意一点:在类型声明文件中,顶层值要使用declare关键字(declare let,declare function,declare class等),而顶层类型和接口则不需要。

下面说明每种类型声明。

11.1.1 外参变量声明

外参变量声明让Typescript知道全局变量的存在,无须显式导入即可在项目中的任何.ts和.d.ts中使用。

假设你在浏览器中运行nodejs程序,某个时刻,该程序会检查process.env.NODE_ENV的值(为“development”或”production“)。运行这个程序。你会看到错误

可以自己定义process.env.NODE_ENV

process = {env:{NODE_ENV:'production'}
}
// 不报错但是有提示
declare let process:{env:{NODE_EMV:"development"|"production"}
}
process = {env:{NODE_ENV:'production'}
}

我们向Typescript声明,有个全局对象名为process,而且该对象有个属性,名为env,对属性名下有一个属性,名为NODE_ENV。告诉Typescript这些信息之后,报错提示就会消失,现在可以安全地定义全局对象process。

TSC设置:lib

Typescript自带一些类型声明,用于描述JavaScript标准库,包括JavaScript内置的类型,例如Array和Promise;例如window和document及onmessage(职程)

11.1.2 外参类型声明

// types.ts
type A = string
全局可用

11.1.3 外参模块声明

// types.ts
declare module "test-module" {export type name = stringlet test:nameexport default test
}

未完待续!!!!!

相关文章:

Typescript 第十一章 与JavaScript互操作(外参变量声明,外参类型声明,外参模块声明)

第十一章 与JavaScript互操作 本章讨论在实际开发中如何编写Typescript。有可能你真正把代码从无类型语言向Typescript迁移。也有可能要使用第三方库。 使用类型声明逐步从JavaScript迁移到Typescript使用第三方JavaScript和Typescript 11.1 类型声明 类型声明文件的扩展名…...

从0到1框架搭建,Python+Pytest+Allure+Git+Jenkins接口自动化框架(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口测试是对系统…...

在windows配置redis的一些错误及解决方案

目录 Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException:用客户端Redis Desktop Manager一样的密码端口&#xff0c;是可以正常连接的&#xff0c;但是运行java程序之后使用接口请求就会报错 Unable to connect to Redis; nested e…...

真机搭建中小网络

这是b站上的一个视频&#xff0c;演示了如何搭建一个典型的中小网络&#xff0c;供企业使用 一、上行端口&#xff1a;上行端口就是连接汇聚或者核心层的口&#xff0c;或者是出广域网互联网的口。也可理解成上传数据的端口。 二、下行端口&#xff1a;连接数据线进行下载的端…...

Linux:shell脚本:基础使用(1)

Shell的作用 命令解释器&#xff0c;“翻译官”&#xff0c;介于系统内核与用户之间&#xff0c;负责解释命令行 用户的登录Shell 登录后默认使用的Shell程序&#xff0c;一般为 /bin/bash 不同Shell的内部指令、运行环境等会有所区别 cat /etc/shells 编写第一个Shell脚本 …...

carla中lka实现(一)

前言&#xff1a; 对于之前项目中工作内容进行总结&#xff0c;使用Carla中的车辆进行lka算法调试&#xff0c;整体技术路线&#xff1a; ①在Carla中生成车辆&#xff0c;并在车辆上搭载camera&#xff0c;通过camera采集图像数据&#xff1b; ②使用图像处理lka算法&#…...

常见的数据结构(顺序表、顺序表、链表、栈、队列、二叉树)

线性表&#xff08;Linear List&#xff09;  1.什么是线性表 2.线性表的特点 3.线性表的基本运算 顺序表 1.什么是顺序表 2.时间复杂度&#xff1a; 链表 1.什么是链表 2.单向链表 3. 双向链表 4.ArrayList和LinkedList的使用 栈Stack  1.什么是栈  2.栈的基本方法 队列…...

(12)理解委托,反射,Type,EvenInfo,插件, 组合枚举,BindingFlags,扩展方法及重载,XML认识

一、复习委托事件 1、委托复习。 private delegate int MyDelegate(int a, int b); //1.定义委托类型private static void Main(string[] args){MyDelegate md new MyDelegate(AddDelegate);//2.声明委托变量int result md(1, 2);//3.调用委托Console.WriteLine(result);Cons…...

软件建设方案技术方案实施方案密码评测方案等保测评方案人员培训方案项目建设与运行管理项目招标方案模板目录

第一章 项目概述 1.项目名称(包含项目全称和简称) 2.项目建设单位及负责人、项目责任人 3.项目建设依据 (1)政策依据(主要从国家、省、市、行业部门相关的政策文件要求等方面进行描述) (2)技术标准 4.项目建设目标、建设任务 5.项目主要建设内容、规模、建设周期…...

pytorch中torch.einsum函数的详细计算过程图解

第一次见到 rel_h torch.einsum(“bhwc,hkc->bhwk”, r_q, Rh)这行代码时&#xff0c;属实是懵了&#xff0c;网上找了很多博主的介绍&#xff0c;但都没有详细的说明函数内部的计算过程&#xff0c;看得我是一头雾水&#xff0c;只知道计算结果的维度是如何变化的&#xf…...

【iOS】App仿写--天气预报

文章目录 前言一、首页二、搜索界面三、添加界面四、浏览界面总结 前言 最近完成了暑假的最后一个任务——天气预报&#xff0c;特此记录博客总结。根据iPhone中天气App的功能大致可以将仿写的App分为四个界面——首页&#xff0c;搜索界面&#xff0c;添加界面&#xff0c;浏…...

快速远程桌面控制公司电脑远程办公

文章目录 第一步第二步第三步 远程办公的概念很早就被提出来&#xff0c;但似乎并没有多少项目普及落实到实际应用层面&#xff0c;至少在前几年&#xff0c;远程办公距离我们仍然很遥远。但2019年末突如其来的疫情&#xff0c;着实打了大家一个措手不及。尽管国内最初的大面积…...

亚信科技AntDB数据库专家出席数据库标准研讨会并参与研讨

2023年7月12日&#xff0c;全国信息技术标准化技术委员会数据库标准工作组&#xff08;SAC/TC28/WG31&#xff09;秘书处组织召开数据库标准研讨会&#xff0c;会议围绕数据库标准工作组2023年上半年开展的标准编制情况进行交流。亚信科技AntDB数据库相关专家出席会议&#xff…...

【我们一起60天准备考研算法面试(大全)-第三十四天 34/60】【前缀和】【北邮】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…...

【数据分析】numpy (二)

numpy作为数据分析&#xff0c;深度学习常用的库&#xff0c;本篇博客我们来介绍numpy的一些进阶用法&#xff1a; 一&#xff0c;numpy的常用简单内置函数&#xff1a; 1.1求和&#xff1a; a np.array([[1, 2],[3, 4]]) np.sum(a)10 1.2求平均值&#xff1a; np.mean(a…...

Vue3小案例—v-model 双向数据绑定实现动态列表增加和删除

v-model双向绑定的原理&#xff1a;   v-model 是Vue.js 提供的一个指令&#xff0c;用于实现双向数据绑定&#xff0c;它可以将表单元素的值与Vue实例的数据绑定在一起&#xff0c;当表单元素的值发生改变时&#xff0c;Vue实例的数据也会随之更新&#xff0c;反之亦然。  …...

MySQL 重置root 密码

5.7 版本 首先要把服务mysql57 关闭 net stop MySQL57 在安装的mysql57的程序的bin中 运行cmd&#xff08;管理员运行&#xff09; mysqld --defaults-file‘mysql存放数据的位置\my.ini’ --skip-grant-tables 上图 错误 注意&#xff1a;如果遇到mysqld: Can’t change dir…...

OpenCV图像处理技巧之空间滤波

1. 引言 再次问好&#xff0c;图像处理爱好者们&#xff01;&#x1f31f; 在前面的章节中&#xff0c;我们学习了图像处理的基础知识&#xff0c;并展现了图像增强的魅力。在这一节中&#xff0c;我们将更深入地研究空间滤波技术。 闲话少说&#xff0c;我们直接开始吧&#…...

Java超级玛丽小游戏制作过程讲解 第一天 创建窗口

package com.sxt;import javax.swing.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;public class MyFrame extends JFrame implements KeyListener {//设置窗口的大小为800*600public MyFrame() {this.setSize(800, 600);//设置窗口中显示this.setLo…...

【POP3/IMAP/SMTP】QQ邮箱设置

什么是 POP3/IMAP/SMTP 服务 POP3 &#xff08;Post Office Protocol - Version 3&#xff09;协议用于支持使用电子邮件客户端获取并删除在服务器上的电子邮件。 IMAP &#xff08;Internet Message Access Protocol&#xff09;协议用于支持使用电子邮件客户端交互式存取服务…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...