终于搞懂类型声明文件.d.ts和declare了,原来用处如此大

项目中的.d.ts和declare

最近开发项目,发现公司代码里都有一些.d.ts后缀的文件

还有一些奇奇怪怪的declare代码

秉持着虚心学习的态度,我向同事请教了这些知识点,发现这些东西居然蛮重要的。于是,我根据自己的理解,把这些知识简单总结一下。

类型声明文件.d.ts

为什么需要 .d.ts 文件?

如果我们在ts项目中使用第三方库时,如果这个库内置类型声明文件.d.ts,我们在写代码时可以获得对应的代码补全、接口提示等功能。

比如,我们在index.ts中使用aixos时:

当我们引入axios时,ts会检索aixos的package.json文件,并通过其types属性查找类型声明文件,查找到index.d.ts这个文件后,就会根据其内部配置进行语法提示。

但是如果某个库没有内置类型声明文件时,我们使用这个库,不会获得Ts的语法提示,甚至会有类型报错警告

像这种没有内置类型声明文件的,我们就可以自己创建一个xx.d.ts的文件来自己声明,ts会自动读取到这个文件里面的内容的。比如,我们在index.ts中使用"vue-drag",会提示缺少声明文件。

由于这个库没有@types/xxxx声明包,因此,我们可以在项目内自定义一个vueDrag.d.ts声明文件。

// vueDrag.d.ts

declare module 'vue-drag'

这个时候,就不会报错了,没什么警告了。

第三方库的默认类型声明文件

当我们引入第三方库时,ts会自动检索aixos的package.json文件,并通过其types属性查找类型声明文件,查找到index.d.ts这个文件后,就会根据其内部配置进行语法提示。比如,我们刚才说的axios

  • "typings"与"types"具有相同的意义,也可以使用它。
  • 主声明文件名是index.d.ts并且位置在包的根目录里(与index.js并列),你就不需要使用"types"属性指定了。

第三方库的@types/xxxx类型声明文件

如express这类框架,它们的开发时Ts还没有流行,自然没有使用Ts进行开发,也自然不会有ts的类型声明文件。如果你想引入它们时也获得Ts的语法提示,就需要引入它们对应的声明文件npm包了。

使用声明文件包,不用重构原来的代码就可以在引入这些库时获得Ts的语法提示

比如,我们安装express对应的声明文件包后,就可以获得相应的语法提示了。

@types/express包内的声明文件

.d.ts声明文件

通过上述的几个示例,我们可以知道.d.ts文件的作用和@types/xxxx包一致,@type/xxx需要下载使用,而.d.ts是我们自己创建在项目内的。

.d.ts文件除了可以声明模块,也可以用来声明变量。

例如,我们有一个简单的 JavaScript 函数,用于计算两个数字的总和:

// math.js

const sum = (a, b) => a + b export { sum }

TypeScript 没有关于函数的任何信息,包括名称、参数类型。为了在 TypeScript 文件中使用该函数,我们在 d.ts 文件中提供其定义:

// math.d.ts

declare function sum(a: number, b: number): number

现在,我们可以在 TypeScript 中使用该函数,而不会出现任何编译错误。

.ts 是标准的 TypeScript 文件。其内容将被编译为 JavaScript。

*.d.ts 是允许在 TypeScript 中使用现有 JavaScript 代码的类型定义文件,其不会编译为 JavaScript。

shims-vue.d.ts

shims-vue.d.ts 文件的主要作用是声明 Vue 文件的模块类型,使得 TypeScript 能够正确地处理 .vue 文件,并且不再报错。通常这个文件会放在项目的根目录或 src 目录中。

shims-vue.d.ts 文件的内容一般长这样:

// shims-vue.d.ts

declare module '*.vue' {

    import { DefineComponent } from 'vue';
    
    const component: DefineComponent<{}, {}, any>;

    export default component;

}
  • declare module '*.vue' : 这行代码声明了一个模块,匹配所有以 .vue 结尾的文件。* 是通配符,表示任意文件名。
  • import { DefineComponent } from 'vue'; : 引入 Vue 的 DefineComponent 类型。这是 Vue 3 中定义组件的类型,它具有良好的类型推断和检查功能。
  • const component: DefineComponent<{}, {}, any>; : 定义一个常量 component,它的类型是 DefineComponent,并且泛型参数设置为 {} 表示没有 props 和 methods 的基本 Vue 组件类型。any 用来宽泛地表示组件的任意状态。
  • export default component; : 将这个组件类型默认导出。这样,当你在 TypeScript 文件中导入 .vue 文件时,TypeScript 就知道导入的内容是一个 Vue 组件。

declare

.d.ts 文件中的顶级声明必须以 “declare” 或 “export” 修饰符开头。

通过declare声明的类型或者变量或者模块,在include包含的文件范围内,都可以直接引用而不用去import或者import type相应的变量或者类型。

  • declare声明一个类型
declare type Asd { name: string; }
  • declare声明一个模块
declare module '*.css';

declare module '*.less';

declare module '*.png';

.d.ts文件顶级声明declare最好不要跟export同级使用,不然在其他ts引用这个.d.ts的内容的时候,就需要手动import导入了

在.d.ts文件里如果顶级声明不用export的话,declare和直接写type、interface效果是一样的,在其他地方都可以直接引用

declare type Ass = { 
    a: string; 
} 

type Bss = { 
    b: string; 
};

<think>好的,用户想在Vue项目中了解如何创建使用.d.ts类型声明文件。首先,我需要回忆一下相关的知识。记得在TypeScript项目中,.d.ts文件用于声明类型,这样可以在其他地方直接使用这些类型而无需导入。Vue项目,尤其是使用TypeScript的时候,通常会有一些特定的声明文件,比如shims-vue.d.tsshims.tsx.d.ts,这些可能Vue文件组件以及JSX的支持有关。 根据用户提供的引用,引用[2]提到在Vue3Vite项目中配置.d.ts文件,需要在src同级目录下创建types目录,然后在里面创建比如user.d.ts。这可能涉及到在tsconfig.json中配置typeRoots或者include,确保TypeScript编译器能找到这些声明文件。 另外,引用[3]中的例子展示了如何声明全局类型,比如RecordableNullable,这样在项目中任何地方都可以使用这些类型而无需显式导入。这说明在global.d.ts中声明全局类型是一种常见做法。 接下来需要分步骤说明如何创建使用这些文件。首先,创建文件的位置很重要,应该放在项目根目录或者特定的types目录下,然后在tsconfig.json中配置包含这些路径。然后,根据不同的用途,比如模块扩展、全局类型或第三方库类型补充,分别处理。 用户可能遇到的问题包括:如何让TypeScript识别这些声明文件?如何正确放置这些文件?以及不同场景下的具体写法,比如模块声明全局类型声明的区别。需要详细说明这些步骤,并给出示例代码,比如声明Vue组件模块、声明全局接口等。 同时,用户可能希望知道实际应用中的例子,比如在业务代码中使用自定义类型,或者在组件中引入类型。需要确保示例准确,并且符合Vue3TypeScript的最佳实践。 最后,要检查是否有遗漏的要点,比如测试类型是否生效,或者如何处理第三方库的类型扩展。确保回答覆盖了创建、配置、使用以及常见场景,这样用户能够全面理解如何在Vue项目中利用.d.ts文件来管理类型声明。</think>### 如何在 Vue 项目中创建使用 .d.ts 类型声明文件 #### 一、创建 .d.ts 文件的步骤 1. **文件位置** - 若声明全局类型(全局生效),建议放在项目根目录或 `src/types` 目录下,例如: ```bash src/ ├─ types/ │ ├─ global.d.ts # 全局类型声明 │ ├─ user.d.ts # 用户相关接口声明 ``` - 若为特定模块扩展类型,可直接放在模块同级目录,例如: ```bash src/ ├─ components/ │ ├─ Button.vue │ ├─ Button.d.ts # 针对 Button 组件的类型声明 ``` 2. **配置 TypeScript** 在 `tsconfig.json` 中确保包含声明文件路径: ```json { "compilerOptions": { "typeRoots": ["./node_modules/@types", "./src/types"] }, "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.vue"] } ``` #### 二、常见使用场景 1. **声明全局类型** 在 `global.d.ts` 中定义全局类型,无需导入即可使用: ```typescript // src/types/global.d.ts declare type Recordable<T = any> = Record<string, T>; declare interface User { id: number; name: string; } ``` 2. **扩展第三方库类型** 补充 Vue 组件或库的类型定义: ```typescript // shims-vue.d.ts declare module "*.vue" { import { DefineComponent } from "vue"; const component: DefineComponent<{}, {}, any>; export default component; } ``` 3. **模块化类型管理** 针对业务逻辑声明独立类型文件: ```typescript // src/types/user.d.ts export interface LoginParams { username: string; password: string; } ``` #### 三、实际应用示例 1. **在组件中使用自定义类型** ```vue <script setup lang="ts"> import type { User } from "@/types/user"; // 从声明文件导入类型 const user: User = { id: 1, name: "Alice" }; </script> ``` 2. **全局类型直接调用** ```typescript // 任何 .ts 文件中 const data: Recordable = { key: "value" }; ``` #### 四、验证类型是否生效 1. 在代码中使用声明类型,若 IDE(如 VSCode)无报错且能自动补全,则配置成功[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LiuPing_Xie

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

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

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

打赏作者

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

抵扣说明:

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

余额充值