打算为你的团队写一个封装好的工具?TS的声明文件是必不可少的,它不仅仅让你的工具支持TS,更是负责充当一个说明书的作用,让人对其的使用一目了然。

什么是声明语句?什么时候需要他?

假如我们想使用第三方库 jQuery,一种常见的方式是在 html 中通过script 标签引入 jQuery,然后就可以使用全局变量 $ 或 jQuery 了。

我们通常这样获取一个 id 是 foo 的元素:

$('#foo');

// or

jQuery('#foo');

// ts并不了解这两个变量从何来,到哪去。我们可以告诉ts的编译器,这个东西大概是什么

// 其用于编译时的检查,在编译结果中会被删除

declare var jQuery: (selector: string) => any;

jQuery('#foo');

复制代码

这就是声明语句。如果你是js编写的,往往需要一个声明文件。

如果你是ts编写的,那么让ts自动生成就好了。

以下教程根据js的库进行编写声明文件。

什么是声明文件?

你可以把声明语句看作是声明文件的“组件”。声明语句组成声明文件。

通常我们会把声明语句放到一个单独的文件{(jQuery.d.ts)声明文件必需以 .d.ts 为后缀。}中,这就是声明文件

// src/jQuery.d.ts

declare var jQuery: (selector: string) => any;

复制代码

一般来说,ts 会解析项目中所有的 *.ts 文件, .d.ts 的文件也属于*.ts文件。

所以当我们将 jQuery.d.ts 放到项目中时,其他所有 *.ts 文件就都可以获得 jQuery 的类型定义了。

假如仍然无法解析,那么可以检查下 tsconfig.json 。

这里只演示了全局变量模式的声明文件,通过模块导入的方式的话,那么引入声明文件又是另一种方式了。

书写声明文件!

一般来说第三方库都会提供声明文件,我们只需要安装它就好了。

但有一些库不会提供声明文件,我们就需要自己书写声明文件了。

前面只介绍了最简单的声明文件内容,而真正书写一个声明文件并不是一件简单的事

书写声明文件有多种场景需要契合,例如npm导入和script导入的声明文件的写法与使用方法都不一样,我们这也知会讨论比较常用的这两种方式,如果看官有兴趣,可以自行移步教程学习。

1. 全局变量:通过 script 标签引入第三方库,注入全局变量

全局变量是最简单的一种场景,之前举的例子就是通过 script 标签引入 jQuery,注入全局变量 $ 和 jQuery。

使用全局变量的声明文件时,如果是以 npm install @types/xxx --save-dev 安装的,则不需要任何配置。

如果是将声明文件直接存放于当前项目中,则建议和其他源码一起放到 src 目录下(或者对应的源码目录下):

/path/to/project

├── src

| ├── index.ts

| └── jQuery.d.ts

└── tsconfig.json

复制代码

如果没有生效,可以检查下 tsconfig.json 中的 files、include 和 exclude 配置,确保其包含了 jQuery.d.ts 文件。

全局变量的声明文件主要有以下几种语法:

1. declare var / let / const声明全局变量

没什么区别 const定义的无法修改。

```

//使用const的时候是最多的,一般不允许他人修改你的函数

declare const jQuery: (selector: string) => any;

```

复制代码

2. declare function 声明全局方法

```

declare function jQuery(selector: string): any;

```

复制代码

3. declare class 声明全局类

```

declare class Animal {

name: string;

constructor(name: string);

sayHi(): string;

}

//其他文件中

let cat = new Animal('Tom');

```

复制代码

4. declare enum 声明全局枚举类型

不讨论,这个需要后面的知识

复制代码

5. declare namespace 声明(含有子属性的)全局对象

declare namespace 还是比较常用的,它用来表示全局变量是一个对象,包含很多子属性。

举个例子:

//jQuery 是一个全局变量,它是一个对象

//jQuery.ajax 方法可以调用

//那么我们就应该使用 declare namespace jQuery 来声明这个属性的全局变量。

declare namespace jQuery {

function ajax(url: string, settings?: any): void;

}

//更为复杂一点的例子

declare namespace jQuery {

function ajax(url: string, settings?: any): void;

const version: number;

class Event {

blur(eventType: EventType): void

}

enum EventType {

CustomClick

}

}

复制代码

当然嵌套也是经常看到的事情,我们也可以使用namespace嵌套使用

declare namespace jQuery {

function ajax(url: string, settings?: any): void;

namespace fn {

function extend(object: any): void;

}

}

复制代码

6. interface 和 type 声明全局类型

除了主要的全局变量之外,可能有一些类型我们也希望能暴露出来。

在类型声明文件中,我们可以直接使用 interface 或 type 来声明一个全局的接口或类型:

// src/jQuery.d.ts

interface AjaxSettings {

method?: 'GET' | 'POST'

data?: any;

}

declare namespace jQuery {

function ajax(url: string, settings?: AjaxSettings): void;

}

复制代码

2. npm 包:通过 import foo from 'foo' 导入,符合 ES6 模块规范

在我们给一个 npm 包创建声明文件之前,需要先看看它的声明文件是否已经存在。一般来说,npm 包的声明文件可能存在于两个地方:

与该 npm 包在一起。package.json中有types字段,或有一个index.d.ts声明文件。这种模式不需要额外安装其他包,是最为推荐的,所以以后我们自己创建 npm 包的时候,最好也将声明文件与 npm 包绑定在一起。

发布到 @types 里。我们只需要尝试安装一下对应的 @types 包就知道是否存在该声明文件,安装命令是 npm install @types/foo --save-dev。这种模式一般是由于 npm 包的维护者没有提供声明文件,所以只能由其他人将声明文件发布到 @types 里了。

假如以上两种方式都没有找到对应的声明文件,那么我们就需要自己为它写声明文件了。

由于是通过 import 语句导入的模块,所以声明文件存放的位置也有所约束,一般有两种方案:

创建一个 node_modules/@types/foo/index.d.ts 文件,存放 foo 模块的声明文件。这种方式不需要额外的配置,但是 node_modules 目录不稳定,代码也没有被保存到仓库中,无法回溯版本,有不小心被删除的风险,故不太建议用这种方案,一般只用作临时测试。

创建一个 types 目录,专门用来管理自己写的声明文件,将 foo 的声明文件放到 types/foo/index.d.ts 中。这种方式需要配置下 tsconfig.json 中的 paths 和 baseUrl 字段。

介绍一下第二种方案

├── src

| └── index.ts

├── types

| └── foo

| └── index.d.ts

└── tsconfig.json

//tsconfig.json

{

"compilerOptions": {

"module": "commonjs",

"baseUrl": "./",

"paths": {

"*": ["types/*"]

}

}

}

复制代码

npm 包的声明文件主要有以下几种语法:

1. export 导出变量

在 npm 包的声明文件中,使用 declare 不再会声明一个全局变量,而只会在当前文件中声明一个局部变量。

只有在声明文件中使用 export 导出,然后在使用方 import 导入后,才会应用到这些类型声明。

export namespace 导出(含有子属性的)对象

// 某声明文件

export const name: string;

export function getName(): string;

export class Animal {

constructor(name: string);

sayHi(): string;

}

export enum Directions {

Up,

Down,

Left,

Right

}

export interface Options {

data: any;

}

// 某使用文件

import { name, getName, Animal, Directions, Options } from 'foo';

console.log(name);

let myName = getName();

let cat = new Animal('Tom');

let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];

let options: Options = {

data: {

name: 'foo'

}

};

复制代码export default ES6 默认导出

export = commonjs 导出模块

。。。烂尾,感觉没啥好写的,很好理解

内容从此处摘抄

https://ts.xcatliu.com/basics/declaration-files.html#%E4%B9%A6%E5%86%99%E5%A3%B0%E6%98%8E%E6%96%87%E4%BB%B6

复制代码

ts自动编译声明文件_TS 的声明文件相关推荐

  1. ts自动编译声明文件_拥抱 TS:细数选择 TS 的 N 种理由

    作者 | 马靖 day day up, bye bye bug 最近在做一个新项目,技术大佬告知前端要用 TS .前端小白的我内心疑惑"弱类型语言它不香嘛,为什么选择 TS ?" ...

  2. Vue3通透教程【十六】TS自动编译

    文章目录

  3. 用 powershell 脚本 .ps1 写一个自动化的「编译->链接->运行C++文件」脚本

    │ abc.cpp │ main.cpp │ test.ps1 │ └─.vscodec_cpp_properties.jsonsettings.json 我这人有个毛病:一定要用 VS Code 写 ...

  4. class ts 扩展方法_ts类型声明文件的正确使用姿势

    ts类型声明文件的正确使用姿势 ts声明文件类型 npm install @types/jquery --save-dev 与npm一同发布 解释: package.json 中有 types 字段, ...

  5. ts文件编译与运行,vscode自动编译

    ts文件编译与运行 根据官方文档提示,ts文件无法直接运行,需要编译成js文件. 1.那么问题就来了,如何把ts文件编译成js文件呢? 官方文档说,Visual Studio 2017和Visual ...

  6. C++ : 编译单元、声明和定义、头文件作用、防止头文件在同一个编译单元重复引用、static和不具名空间...

    转 自:http://www.cnblogs.com/rocketfan/archive/2009/10/02/1577361.html 1. 编译单元:一个.cc或.cpp文件作为一个编译单元,生成 ...

  7. php 得到 ts文件,获取TypeScript声明文件.d.ts步骤详解

    这次给大家带来获取TypeScript声明文件.d.ts步骤详解,获取TypeScript声明文件.d.ts的注意事项有哪些,下面就是实战案例,一起来看一下. 一.TypeScript的声明文件就像C ...

  8. 三步 让你的 vscode 自动编译ts文件

    三步让你的 vscode 自动编译ts文件 TypeScript环境安装与如何在vscode实现自动编译ts文件? 文章目录 三步让你的 vscode 自动编译ts文件 前提条件 环境安装 自动编译 ...

  9. C语言一定要有函数声明吗,1 什么是C语言的隐式函数声明在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。下...

    1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码.下面是一个例子: int main(int ...

最新文章

  1. debian编译安装python_编译安装python2.7及相关模块(debian5.0.1)
  2. Linux链接库二(动态库,静态库,库命名规则,建立个没有版本号的软连接文件)...
  3. Android园区部队人脸识别源码门禁项目讲解
  4. Tomcat 教程之快速入门
  5. go语言渐入佳境[9]-doubleloop
  6. Spring web.xml详解
  7. python函数变量的作用域_学不会的Python函数——变量作用域
  8. 英文标点符号翻译大全
  9. 微服务架构一直火,为什么服务化要搞懂?
  10. EasyUI仓库管理系统
  11. 《SEM长尾搜索营销策略解密》一一2.3 一个长尾周期倒下来,还有千千万万个站起来...
  12. matlab画倾斜的椭球_用matlab绘制椭球体x^2/4+y^2/9+z^2/16=1,并通过改变观察点获得它在各个坐标面上的投影。...
  13. mq 的Publish/Subscribe 模式
  14. 2021年登高架设免费试题及登高架设找解析
  15. make[1]: *** Waiting for unfinished jobs....
  16. 域服务器文件备份,怎么备份域服务器?
  17. 基于凸松弛算法的电力市场策略研究(Matlab代码实现)
  18. c# 计算圆锥的体积_用c#编写一个程序计算出球、圆柱和圆锥的表面积和体积。...
  19. 制作“大白菜”启动U盘教程
  20. 有没有二维码制作工具?二维码制作其实很简单

热门文章

  1. wand(wead and)算法简介与改造,修改为店铺与品牌的关键字搜索
  2. 《InsideUE4》GamePlay架构学习_Level和World
  3. 阳光与紫外线或是白内障致病主因
  4. nc服务器修改过ip地址,nc服务器修改过ip地址
  5. android手机接投影仪,手机投屏到投影仪的几种方法
  6. 《编程珠玑,字字珠玑》45678读书笔记——编程技巧
  7. 蓝牙芯片----BK3431开发笔记------RW stack中添加自定义服务教程(4)
  8. win server2016远程桌面连接问题
  9. mysql too long_mysql中data too long for column错误的一种解决办法
  10. Sky Hackthon比赛指北-基础篇