TypeScript 类型声明的三种来源

文章讲述了TypeScript中类型声明的来源,包括内置的lib目录下的DOM和ES类型声明,@types包对Node等环境及第三方库的支持,以及自定义的类型声明文件。TypeScript在编译时会加载这些声明进行类型检查,确保代码的类型安全。
摘要由CSDN通过智能技术生成

你是否写过这样的代码,比如,我们在声明一个div节点时会这样写:

const div: HTMLDivElement = document.createElement('div')

这里的HTMLDivElement,我们并没有声明,这是从哪里来的呢?

还有,我们在使用第三方库的时候,这些库文件明明是用 javascript 写的,为什么也会有类型提示呢?

下面将一一解答上面的问题。

Typescript内置的类型声明文件

我们会经常用到浏览器环境相关的的HTMLElementEvent类型信息,还有 JS 引擎提供的PromiseDateRegExp等。

这些类型声明文件放在哪呢?

TypeScript 包下有个 lib 目录,里面有一堆 lib.xx.d.ts 的类型声明文件,这就是 TS 内置的一些类型声明。

image.png

因为这些只是声明类型,而没有具体的 JS 实现,TS 就给单独设计了一种文件类型,也就是 d.tsddeclare 的意思。

比如 lib.dom.d.ts 里的类型声明:

image.png

因为这些类型声明文件是 ts 内置的,所以需要在tsconfig.json配置一下就可以用了:

image.png

Typescript 内置的类型声明文件只有 DOM 和 ES 的。因为 JS 的 API 还有浏览器的 API 都是有标准的,那自然可以按照标准来定义类型。其余环境的 API 没有标准,经常变,自然就没法内置了,比如 node。

@types 包存放类型声明文件

node 等环境的 API 因为没有标准而没有被 Typescript 内置,但 Typescript 同样也支持了这些环境的类型声明的配置。它是通过 node_modules下的 @types/node的包来支持的,即 node 的类型声明文件放在 @types/node 下面。

Tyepscript 会先加载内置的 lib 的类型声明,然后再去查找 @types 包下的类型声明

image.png

@types 包是在 DefinitelyTyped 这个项目下统一管理的,想创建一个 @types 包的话要去看一下他们的文档。

除了给 node 等环境的 API 加上类型声明外,@types 包还有一种用途,就是给一些 JS 的包加上类型声明。

比如,有一个库的代码原来是用 Javascript 书写的,在 Typescript 工程中使用了这个库,此时如果这个库也需要有类型支持,那么就需要单独写一个 @types/xxx 的包来声明这个库的 ts 类型,然后发布到统一的DefinitelyTyped,最后在工程中安装npm install @types/xxx -D,这样 JS 库也会得到类型支持。

如果这个库本身是用 Tpyescript 写的,那编译的时候就可以开启 compilerOptions.declaration,来生成 d.ts 文件:

image.png

然后在 package.json 里配置 types 来指定 d.ts 的位置:

image.png

至此,Typescript 内置的 DOM 和 ES 的类型声明,其他环境如 node,以及一些第三方库的类型声明我们都知道怎么使用了。

自己写的类型声明文件

在变量声明时我们就可以定义类型,如:

interface Person {
    name: string;
    age: number;
}

const : Person = {
    name: 'xiaoming',
    age: 13
}

除了这种方式外,TS 也支持通过 declare 单独声明类型,且存放类型声明的文件后缀是 d.ts

现在我们声明一个变量calculator,这个变量是一个函数,同时这个函数还有两个属性plusminus

type Operator = 'plus' | 'minus'

interface Icalculator {
  (operator: Operator, numbers: number[]): number
  plus(numbers: number[]): number
  minus(numbers: number[]): number
}

declare const calculator: Icalculator

要使这个类型声明文件生效,需要在tsconfig.json配置 includeexcludefiles:

  • include 用来指定哪些 ts 文件需要被编译,*表示任意目录, 表示任意文件
  • exclude 不需要被编译的文件目录
  • files 指定被编译文件的列表,只有需要编译的文件少时才会用到,不能用通配符,只能是具体的路径
// tsconfig.json
"files": ["calculator.d.ts"]

Typescript 在编译的时候,会分别加载内置的 lib@types 下的,还有 includefiles 的文件,进行类型检查。

这就是 Typescript 类型声明的三种来源。

总结

通过类型声明文件,TypeScript在编译时做类型检查,TypeScript 有三种存放类型声明的地方:

  • lib: 内置的类型声明,包含 DOM 和 ES 的;
  • @types: npm 包的类型声明;
  • 开发者写的代码:通过 include + exclude 还有 files 指定,还有就是在定义变量时写的类型定义;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哎,好难

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值