TypeScript 声明文件

169 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情

什么是声明文件

当我们使用一个非Typescript的第三方包时,怎么让它可以在我们正在写的TS项目中使用,可以通过TS编译器类型检测和提供智能提示,那就是第三方包提供TS的类型声明文件, 让编译器能够知道包中的数据类型、属性等类型信息,这样就能使用它们了。

声明文件的来源:

第三方包都会提供声明文件

一般有名的第三方包都会包含声明文件,项目中直接使用包就行了不用关心,ts编译器会根据包中的package.json文件的types字段自己找声明文件,如果types没有指明会在根目录下找index.d.ts声明文件。

image.png

TS官方和社区提供第三方包的声明文件

如果第三方包中没有我们可以在TS官方找有没有该包对应的声明文件,可以在www.typescriptlang.org/dt/search 中进行搜索,找到后安装后面的命令安装。

npm install @types/jquery --save-dev

image.png

官方或者包中没有声明文件,自己写声明文件。

如果都没有,我们就要自己写声明文件,还有就是我们自己的非ts的子项目要在新的ts项目上用,就得给自己的非ts项目写声明文件。

如何写声明文件

我们如何写声明文件,其实主要是写包提供的方法,模块对象,属性等的类型信息,一般分为两种外部类型声明外部模块声明,以d.ts结尾的文件,在项目中一般放到一个types的目录下。

declare 声明全局类型

d.ts文件中可以用declare关键字声明全局变量let const var、方法function、类class、枚举、enum、命名空间对象namespace。

declare var name: string;
declare const age: number;
declare const tel: string;
declare function getName(): string;
declare class Person {
  name: string;
  age: string;
  constructor(name: string);
  getName(): string;
};
declare enum Status {
  STAET,
  END
};
declare namespace StringUtils {
  declare var dd: string;
  var age: number;
  function numberToString(data: number): string;
  function stringToNumber(data: string): number;
}

interface 和 type 声明全局类型

type DD = string;
interface Person {
  name?: string;
}

export 导出变量

一般我们通过 import utils from 'utils' 导入一个 npm 模块,这是符合 ES6 模块规范的,这种我们写声明文件时一般用export 和import 关键字定义类型的,只要文件中存在export导出的,在文件中的 declare声明的文件不会成为全局类型。

export const name: string;
export function getName(): string;
export class Persoon {
  name: string;
  age: string;
  constructor(name: string);
  getName(): string;
}
export  enum Status {
  STAET,
  END
}