【TS】declare 声明文件

一、文件类型

TS 中有两种文件类型:

  • .ts文件(代码实现文件)
  • .d.ts文件(类型声明文件)
  • .ts文件
1. 既包含类型信息又可执行代码
2. 可以被编译为 .js 文件,然后执行代码
3. 通常用于编写程序代码的地方
  • .d.ts文件
1. 只包含类型信息的类型声明文件
2. 不会生成 .js 文件,仅用于提供类型信息
3. 通常用于为 js 提供类型信息。

二、基本用法

创建自己的类型声明文件有两种:

  1. 项目类共享类型
  2. 为已有JS文件提供类型声明

2.1、项目类共享类型

  • 如果多个.ts文件中都用到用一个类型,此时可以创建.d.ts文件提供该类型,实现类型共享。
  • 操作步骤:
1. 创建 index.d.ts 类型声明文件
2. 创建共享的类型,并使用 export 导出(TS中的类型也可以使用import/export实现模块化功能)
3. 在需要使用共享类型的 .ts 文件中,通过import导入即可(.d.ts后缀导入时,直接省略)
  • index.d.ts文件
type Props = {x: number; y: number;}
export {Props}
  • a.ts文件
import { Props } from './index'
let pp: Props = {
	x: 1,
	y: 2,
}

2.2、为已有JS文件提供类型声明

  • 一般用于:
1. 在将JS项目迁移到TS项目时,为了让已有的 .js 文件有类型声明
2. 成为库作者,创建库给其他人使用
  • 在导入 .js 文件时,TS会自动加载与 .js 同名的 .d.ts文件,以提供类型声明。
  • declare 关键字:用于类型声明,为其他地方(比如:.js文件)一存在的变量声明类型,而不是创建应该新的变量。
3. 对于 typeinterface 等这些明确就是TS类型的,可以省略declare关键字
4. 对于 letfunction 等具有双重含义(在JSTS中都能用),应该使用declare关键字,明确指定此处用于类型声明
  • utils.js文件
let count = 10;
let songName = 'aaa';
let position = {
	x: 0,
	y: 0,
}
function add (x,y){
	return x + y;
}
function changeDirection(direction) {
	console.log(direction)
}
const fomartPoint = point => {
	console.log('当前坐标:',point)
}
export {count, songName, position, add, changeDirection, fomartPoint}
  • utils.d.ts文件
declare let count: number;
declare let songName: string;
interface Point {
	x: number;
	y: number;
}
declare let position: Point;
declare funcition add(x:number, y:number):number
declare funcition  changeDirection(
	direction: 'up' | 'down' | 'left' | 'right'
): void
type FomartPoint = (point: Point)=>void
declare const fomartPoint: FonmarePoint;

// 需要导出声明好的类型,才能在其他的 .ts 文件中使用
export {count, songName, position, add, changeDirection, fomartPoint}

三、实际运用

以 .ice 脚手架搭建的 react 项目为例:

  • typings.d.ts 文件:
declare module '*.module.less' {
  const classes: { [key: string]: string };
  export default classes;
}

declare module '*.module.css' {
  const classes: { [key: string]: string };
  export default classes;
}

 module '*.module.scss' {
  const classes: { [key: string]: string };
  export default classes;
}

declare module '*.svg' {
  const src: string;
  export default src;
}
  • tsconfig.json文件:
{
  "compileOnSave": false,
  "buildOnSave": false,
  "compilerOptions": {
    "baseUrl": ".",
    "outDir": "build",
    "module": "esnext",
    "target": "es6",
    "jsx": "react-jsx",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "lib": [
      "es6",
      "dom"
    ],
    "sourceMap": true,
    "allowJs": true,
    "rootDir": "./",
    "forceConsistentCasingInFileNames": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noImplicitAny": false,
    "importHelpers": true,
    "strictNullChecks": true,
    "suppressImplicitAnyIndexErrors": true,
    "noUnusedLocals": true,
    "skipLibCheck": true,
    "paths": {
      "@/*": [
        "./src/*"
      ],
      "ice": [
        ".ice"
      ]
    },
    "resolveJsonModule": true
  },
  "include": [	// include:指定允许ts处理的目录:
    "src",
    ".ice",
    "src/typings.d.ts"	// 使用
  ],
  "exclude": [
    "node_modules",
    "build",
    "public"
  ]
}
  • 如果有多个声明文件,目录结构如下所示:
 一 typings
丨一 一 flow.d.ts
丨一 一 index.d.ts
  • tsconfig.json文件:
"include": [
    "./src/**/*",
    "./typings/**/*"
  ],
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
TypeScript 中的 declare 关键字用于声明某些变量、函数或类的类型,但并不实际定义它们的实现。这是因为 TypeScript 可以用来编写 JavaScript,而 JavaScript 中的许多变量、函数或类并没有明确定义它们的类型。因此,使用 declare 关键字可以帮助 TypeScript 理解这些 JavaScript 代码的类型。 declare 关键字的使用有以下几种情况: 1. 声明全局变量或函数 在 TypeScript 中,全局变量或函数应该在任何文件中都可以访问。但如果这些变量或函数没有明确定义类型,则 TypeScript 编译器可能无法正确解析它们的类型。因此,使用 declare 关键字可以告诉编译器这些变量或函数的类型。 例如,以下代码声明了一个全局变量 message,并指定它的类型为字符串: ``` declare var message: string; ``` 2. 声明模块 在 TypeScript 中,可以使用 declare 关键字来声明模块的类型。例如,以下代码声明了一个名为 MyModule 的模块,并指定它包含一个名为 myFunction 的函数: ``` declare module MyModule { function myFunction(): void; } ``` 3. 声明类的类型 在 TypeScript 中,可以使用 declare 关键字来声明一个类的类型,而不实际定义它的实现。这通常用于与第三方库集成时,以便编译器知道这些类的类型。 例如,以下代码声明了一个名为 MyLibrary 的类,并指定它包含一个名为 myFunction 的方法: ``` declare class MyLibrary { myFunction(): void; } ``` 需要注意的是,使用 declare 关键字并不会实际生成任何代码,它只是告诉编译器这些变量、函数或类的类型。因此,如果使用 declare 关键字声明一个变量、函数或类的类型,就必须确保在代码中正确地实现它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一颗不甘坠落的流星

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

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

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

打赏作者

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

抵扣说明:

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

余额充值