作用
场景
一般如果你的代码是用typescript写的话,你是不需要写d.ts的声明文件的。因为typescript的编译器编译后会自动生成d.ts文件。
所以,一般需要自己写d.ts文件的场景,是你的代码原本是用js写的时候。
基础
- 定义文件命名:
xx.d.ts 使用
declaredeclare var JQuery: (selector: string) => any;
如果 JQuery 是通过
<script>标签引入,不是通过 import 引入,则以上声明可以使ts不报错npm包名为@types/xx是声明文件@type/XX包的创建,需要向 DefinitelyTyped 提交定义文件,需要其审批。社区- 默认情况下,
node_modules下面的@types包都会被编译器自动加载编写声明文件
给以下封装方法添加声明文件 ```typescript function myFetch(url, method, data) { return fetch(url, { body: data ? JSON.stringify(data) : ‘’, method }).then(resp => resp.json()) }
myFetch.get = (url) => { return myFetch(url, ‘GET’, ‘’) }
myFetch.post = (url, data) => { return myFetch(url, ‘POST’, data) }
export default myFetch
```typescripttype HTTPMethod = 'GET' | 'POST' | 'PATCH' | 'DELETE'declare function myFetch<T = any>(url: string, method: HTTPMethod, data?: any): Promise<T>// 定义变量中的方法declare namespace myFetch {const get: <T = any>(url: string) => Promise<T>;const post: <T = any>(url: string, data: any) => Promise<T>;}export = myFetch // 放入 node_modules 后要添加!!!!
可以放入一下文件夹中
node_modules|—— @types|—— myFetch|—— index.d.ts
现在,在 ts 文件中写 myFatch 方法时,就可一个获得提示了
import myFetch from 'myFetch';myFetch<string>('test', 'POST', { name: 'hello' }).then(data => {// data.charCodeAt})myFetch.get<number>('url').then(res => {// res.toFixed})
注意:
- 这样做,只是为了在书写 ts 代码时获得良好的提示。实际方法的执行逻辑是没有的,在编译成 js 执行会报错
import导入的文件,实际上是node_modules/@types/myFetch/index
注意:
ts声明文件的文件名,应和实际的js文件名保持一致(.d.ts是声明文件的固定格式)
实践

