TS:.d.ts 文件 和 declare 的作用

这篇具有很好参考价值的文章主要介绍了TS:.d.ts 文件 和 declare 的作用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


先说一下我对 .d.ts文件 和 declare 的理解,.d.ts文件 和 declare 都是用来做 外部声明 的,而 .d.ts 文件做外部声明是 declare 做外部声明的简化形式。

备注:
我理解 外部声明 就是 声明全局类型、变量或者模块,可以直接使用而不用去 import 或者 import type 相应的变量或者类型。

1 declare 做外部声明

如果 types.ts 文件在 ts 编译范围内的情况下,在 types.ts 文件中,通过 declare 声明的变量、类型或者模块是全局性的,即,可以在不导入类型的情况下直接使用。

1. 何为 types.ts 文件在 ts 编译范围内的情况下?
在 TS 配置文件(tsconfig.js)中,通过 include 选项设置的编译范围内包含 types.ts 文件。
2. 用 declarre 声明的变量、类型或者模块不能全局使用的情况?
types.ts 文件不能是模块,即,文件内不用有导入/导出语句(import,import type,export,export type)。如果文件中包含导入导出语句,types.ts 文件中的声明将失去全局性,必须导出声明,并在使用时先导入,否则会报错。

1.1 声明外部类型

// ajax 请求方式
declare type AjaxType = 'GET' | 'POST' | 'DELETE' | 'PUT' | 'PATCH';

1.2 声明外部模块

1.2.1 解决引入资源模块报错

declare module '*.css';
declare module '*.scss';
declare module '*.png';

此例中,不对导入的资源模块进行类型检查。如果不进行以上声明,导入 css/less/png 等资源文件时会提示编译错误。

1.2.2 跳过对第三方库的类型检查

declare module 'jquery';

如果想要使用一些用js 编写的第三方库,可以通过声明外部模块,跳过对第三方库的类型检查
此例中,jquery模块中所有成员的类型都成了any类型,这等同于不对jQuery进行类型检查。

1.3 声明外部变量

declare var a: boolean;
declare let b: boolean;
declare const c: boolean;

如果外部变量声明中没有使用类型注解,那么变量的类型为 any类型

这个什么情况下会用到呢?假如我在项目中引入了一个sdk,这个sdk(我们以微信的sdk为例)里面有一些全局的对象(比如wx),但是如果不经过任何的声明,在ts文件里面直接用wx.config()的话,肯定会报错。

declare就是告诉 TS编译器 你担保这些变量和模块存在,并声明了相应类型,编译的时候按照声明的类型进行类型检查,如果没有声明类型,默认是 any 类型。

1.4 声明外部命名空间(作用域)

declare namespace API {
     var a: boolean;
     let b: boolean;
     const c: boolean;
     function foo(bar: string, baz: boolean): void;
}

外部命名空间的成员默认为导出成员,不需要使用export关键字来明确地导出它们,但使用了export关键字也没有错误。

声明完之后在其他 ts文件中,就可以直接 API.xxx 引用。

2 .d.ts 文件做外部声明

和 declare 做外部声明一样, .d.ts 文件(例如:types.d.ts)在 ts 编译范围内,且 .d.ts 文件不是模块的情况下,文件中声明的变量、类型或者模块都是外部声明。只不过在 .d.ts 文件中的声明可以省略 declare。

// types.d.ts文件中
type PlainObjectType<T = any> = { [propType: string]: T };
// declare type PlainObjectType<T = any> = { [propType: string]: T };

以上两种声明,都是外部声明,效果相同。

注意
1. .d.ts 文件提供的声明仅在编译阶段有效
.d.ts 文件中只提供类型声明,不提供任何值,如字符串和函数实现等,在编译TypeScript程序的过程中,.d.ts文件 不会生成对应的 .js文件
2. .d.ts 文件不能是模块
.d.ts 文件不能是模块,即,文件内不用有导入/导出语句(import,import type,export,export type)。如果文件中包含导入导出语句,.d.ts 文件中的声明将失去全局性,必须导出声明,并在使用时先导入,否则会报错。

3 declare global {} 在模块中做外部声明

使用 declare global {} 可以实现在模块中做外部声明。以下示例中:
MainMenuType 类型 就是外部接口类型,在其他模块中不用引入就可以直接使用。
UserType 类型 在其他模块中需要引入才能使用。文章来源地址https://www.toymoban.com/news/detail-786397.html

import { createSlice } from '@reduxjs/toolkit';
import type { PayloadAction } from '@reduxjs/toolkit';

declare global {
  interface MainMenuType {
    eventCode: string,
    businessCode: string,
    menuOrder: number,
    icon: string,
    menuId: string,
    menuPid: string,
    isMultiple: boolean,
    menuName: string,
    menuType: string,
    menuGroup: string,
    menuAttestWay: string,
    children?: MainMenuType[]
  }
}

export interface UserType {
  common: PlainObjectType,
  mainMenus: MainMenuType[],
  [key: string]: any
}

到了这里,关于TS:.d.ts 文件 和 declare 的作用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TypeScript配置-- 2. 了解ts配置项,根据vite项目了解typescript配置文件,tsconfig.json、tsconfig.node.json、

    仅对于Ts项目来说,产生红色波浪线,主要是由于语法错误,当然也有其他情况… 这边先引入一个greeter.ts文件 发现居然没有跟一些项目一样,有红色的波浪线,不是说了函数里面的参数是需要显示追加类型的吗。 tsconfig.json 不知道有什么配置项?鼠标悬浮试试~~ 具体可以看

    2024年02月03日
    浏览(30)
  • 【TypeScript】TS条件类型(十)

    🐱 个人主页: 不叫猫先生 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏:vue3从入门到精通、TypeScript从入门到实践 📢 资料领取:前端进阶资料以及文中源

    2023年04月11日
    浏览(36)
  • 【TypeScript】TS类型守卫(六)

    🐱个人主页: 不叫猫先生 🙋‍♂️作者简介:前端领域优质创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏:vue3从入门到精通、TypeScript从入门到实践 📝个人签名:不破不立 📢资料领取:前端进阶资料以及文中源码可以

    2024年02月22日
    浏览(35)
  • 【TypeScript】TS类型声明(二)

    🐱个人主页: 不叫猫先生 🙋‍♂️作者简介:前端领域新星创作者、华为云享专家、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏:vue3从入门到精通、TypeScript从入门到实践 📝个人签名:不破不立 TypeScript从入门到实践专栏 是博

    2024年01月20日
    浏览(31)
  • 【TypeScript】TS进阶-装饰器(九)

    🐱个人主页: 不叫猫先生 🙋‍♂️作者简介:前端领域新星创作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏:vue3从入门到精通、TypeScript从入门到实践 📢资料领取:前端进阶资料以及文中源码可以找我免费领取 🔥社群招

    2024年02月21日
    浏览(30)
  • 前端TypeScript学习day01-TS介绍与TS部分常用类型

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 TypeScript 介绍 TypeScript 是什么 TypeScript 为什么要为 JS 添加类型支持?  TypeScript 相比 JS 的优势  TypeScript 初体验  安装编译 TS 的工具包 编译并运行 TS 代码 简化运行 TS

    2024年02月08日
    浏览(27)
  • TypeScript ~ TS 掌握自动编译命令 ③

    @作者 : SYFStrive   @博客首页 : HomePage 📜: TypeScript ~ TS 📌: 个人社区(欢迎大佬们加入) 👉: 社区链接🔗 📌: 觉得文章不错可以点点关注 👉: 专栏连接🔗 👉 微信小程序 (🔥) 👉 UNIAPP开发 (🔥) 提示:以下是本篇文章正文内容 TypeScript是JavaScript的超集。 它对

    2024年02月11日
    浏览(33)
  • TypeScript学习(1)- ts基础配置介绍

    目录 TypeScript是什么? TypeScript开发环境搭建 以JavaScript为基础构建的语言 一个JavaScript的超集 typescript扩展了JavaScript,并添加了类型 可以在任何支持JavaScript的平台中执行 TS不能被js解析器直接执行(ts ---编译---js) 安装node 使用npm 全局安装typescript 创建一个ts文件  使用tsc对

    2024年02月09日
    浏览(34)
  • 【TypeScript】TS入门及基础学习(一)

    一、前言 TypeScript 是一种用于应用程序规模的 JavaScript 语言。 TypeScript 向 JavaScript 添加了可选类型,支持用于任何浏览器、任何主机、任何操作系统的大规模 JavaScript 应用程序的工具。 TypeScript 可编译为可读的、基于标准的 JavaScript。TypeScript属于 强类型语言 ,JavaScript属于弱

    2024年02月14日
    浏览(36)
  • TypeScript基础篇 - TS日常类型 上篇

    目录 TS的常见用法介绍  example01.ts 逃避类型检查:any 思考一下~:不知道类型 类型标注 函数(参数和返回值) 匿名函数 TS如何知道匿名函数的类型? TS是一种标注式语言,不侵入JS的设计 文章内容 基础类型、数组 any/unkown 类型标注 函数 对象类型 联合 别名 接口 断言 字面

    2024年02月16日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包