第9期 一文读懂TS的(.d.ts)文件

简介: 第9期 一文读懂TS的(.d.ts)文件

一、 概述

随着前端技术的不断发展,TypeScript(简称:TS)已经在逐步取代JavaScript(简称:JS),尤其在以Vue3使用TS重构后,TS更是成为前端框架编写的主力语言。

  • 在使用TS的时候,最大的一个好处就是可以给JS各种类型约束,使得JS能够完成静态代码分析,推断代码中存在的类型错误或者进行类型提示
  • TS完成类型推断,需要事先知道变量的类型,如果我们都是用TS书写代码,并且给变量都指定了明确的类型,这时TS可以很好的完成类型推断工作
  • 但是有时,我们不免会引入外部的 JS库,这时TS就对引入的JS文件里变量的具体类型不明确了,为了告诉TS变量的类型,因此就有了.d.ts (d即declare),ts的声明文件。TS身为 JS的超集,那么如何让这些第三方库也可以进行类型推导呢,自然需要考虑到如何让 JS 库也能定义静态类型。今天小编就带大家了解下 JavaScript 和 TypeScript 的静态类型交叉口 —— 类型定义文件d.ts(TypeScript Declaration File),轻松让你的JavaScript也能支持定义静态类型。

二、 什么是“.d.ts” 文件

“d.ts”文件用于为 TypeScript 提供有关用 JavaScript 编写的 API 的类型信息。简单讲,就是你可以在 ts 中调用的 js 的声明文件。TS的核心在于静态类型,我们在编写 TS 的时候会定义很多的类型,但是主流的库都是 JS编写的,并不支持类型系统。这个时候你不能用TS重写主流的库,这个时候我们只需要编写仅包含类型注释的 d.ts 文件,然后从您的 TS 代码中,可以在仍然使用纯 JS 库的同时,获得静态类型检查的 TS 优势。

三、 编写语法

从类型type角度分为:基本类型(string、number、boolean、undefined、symbol)及混合。下面我们介绍下 “.d.ts” 的几种声明的写法。

3.1 全局类型

  • 变量
  • 函数
  • 用interface 声明函数
  • class
  • 对象
  • 混合类型
  • 模块化的全局变量

3.2 模块化的全局变量

定义全局变量的时候需要引入(别人写的)文件

3.3 模块化(CommonJS)

通过require的方式引入模块化的代码

// d.ts
declare module"ever" {
    exportlet a: number
    exportfunction b(): number
    export namespace c{
        let c: string
    }
 }
 // 引用
 cosnt ever = require('ever)
 ever.a = 100
 ever.b = function() {
     return 100 + 300
 }

3.4 ## ES6的模块化方式(import export)

export declare let a1: 1
export declare let a2: 2
// 或
declare let a1: 1
declare let a2: 2
export { a1,a2 }

3.5 UMD

有一种代码,既可以通过全局变量访问到,也可以通过require的方式访问到。

declare namespace ${
    let a:number
}
declare module"$" {
    export =UUU
}

3.6 其他

有时候我们扩展了一些内置对象。给Date的内置对象扩展方法

interface Date {
    format(f: string): string
}

四、案例

/** 作为函数使用 */
declare function People(w: number): number
declare function People(w: string): number
declare class People {
    /** 构造函数 */
    constructor(name: string, age: number)
    constructor(id: number)
    // 实例属性和实例方法
    name: string
    age: number
    getName(): string
    getAge(): number
    /** 作为对象,调用对象上的方法或者变量 */
    static staticA(): number
    static aaa: string
}
/** 作为对象,调用对象上的方法或者变量 */
declare namespace People {
    exportvar abc: number
}

五、常用工具参考

目录
相关文章
|
消息中间件 Linux RocketMQ
【RocketMq】RocketMq 4.9.4 Windows-docker 部署
【RocketMq】RocketMq 4.9.4 Windows-docker 部署
832 0
【RocketMq】RocketMq 4.9.4 Windows-docker 部署
|
机器学习/深度学习 API Python
100天搞定机器学习 番外:使用FastAPI构建机器学习API
100天搞定机器学习 番外:使用FastAPI构建机器学习API
100天搞定机器学习 番外:使用FastAPI构建机器学习API
|
3月前
|
存储 安全 程序员
为什么已经删除的数据还能恢复?数据恢复的原理是什么?
删除数据并非彻底清除,而是标记为可覆盖,原内容仍暂存于存储设备中。只要未被新数据覆盖,通过专业软件即可恢复。本文详解其原理并推荐实用免费工具,支持硬盘、U盘、手机等多设备文件找回。
1077 0
|
5月前
|
运维 监控 Java
Linux常用命令行大全:14个核心指令详解+实战案例
在服务器管理与开发运维领域,Linux 指令是构建技术能力体系的基石。无论是日常的系统监控、文件操作,还是复杂的服务部署与故障排查,熟练掌握指令的使用逻辑都是提升工作效率的核心前提。然而,对于初学者而言,Linux 指令体系往往呈现出“参数繁多易混淆”“组合使用门槛高”“实际场景适配难”等痛点——例如 ls 命令的 -l 与 -a 参数如何搭配查看隐藏文件详情,grep 与管道符结合时如何精准过滤日志内容,这些问题常常成为技术进阶的阻碍。
|
6月前
|
JSON 监控 数据可视化
揭秘淘宝 API,让天猫店铺流量来源一目了然
在竞争激烈的电商环境中,天猫商家最关心的问题之一是流量来源。本文介绍如何利用淘宝开放平台的API接口,帮助商家清晰掌握店铺流量渠道,包括直接访问、搜索、广告及社交媒体流量。通过API获取数据后,可进一步分析访问量、来源占比、跳出率等关键指标,优化营销策略,提升转化率。结合Python编程与图表工具,实现数据可视化分析,助力商家做出数据驱动决策,抢占市场先机。
597 0
|
智能硬件 计算机视觉 网络协议
基于树莓派4B的智能家居系统设计-2
基于树莓派4B的智能家居系统设计
基于树莓派4B的智能家居系统设计-2
|
数据采集 数据安全/隐私保护 开发者
|
数据采集 JSON 前端开发
JavaScript逆向爬虫实战分析
JavaScript逆向爬虫实战分析
286 4
|
传感器 机器学习/深度学习 自动驾驶
【多模态融合】CRN 多视角相机与Radar融合 实现3D检测、目标跟踪、BEV分割 ICCV2023
本文介绍使用雷达与多视角相机融合,实现3D目标检测、3D目标跟踪、道路环境BEV分割,它是来自ICCV2023的。CRN,全称是Camera Radar Net,是一个多视角相机-雷达融合框架。 通过融合多视角相机和雷达的特性,生成语义丰富且空间精确的BEV特征图。实现3D物体检测、跟踪和BEV分割任务。
1915 57
|
存储 Kubernetes 监控
Kubernetes(k8s)集群健康检查常用的五种指标
Kubernetes(k8s)集群健康检查常用的五种指标
2003 1