目录
- 模块化
- 内置类型导入
- 命名空间
- 类型查找
- 内置类型
- 外部定义声明
- 第三方库
- 自定义声明
- `tsconfig.json`文件
- 在Vue项目中应用
- 在React项目中应用
模块化
在TypeScript
中最主要使用的模块化方案就是ES Module
,先理解 TypeScript
认为什么是一个模块:
-
JavaScript
规范声明任何没有export
的JavaScript
文件都应该被认为是一个脚本,而非一个模块 -
在
TypeScript
中如果你有一个文件,现在没有任何import
或者export
,但是你希望它被作为模块处理,添加这行代码export {}
-
这会把文件改成一个没有导出任何内容的模块,这个语法可以生效,无论你的模块目标是什么
内置类型导入
需要使用 type
前缀 ,表明被导入的是一个类型,可以让一个非 TypeScript
编译器比如 Babel、swc
或者 esbuild
知道什么样的导入可以被安全移除
// ./type/index
export type IDType = number
export interface IFoo {
name: string
age: number
}
// main.ts
// import { type IFoo, type IDType } from "./type/index"; // 方式一
import type { IFoo, IDType } from "./type/index"; // 方式二
const id: IDType = 12121212121
const foo: IFoo = {
name: 'foo',
age: 18
}
命名空间
TypeScript
有它自己的模块格式名为 namespaces
,它在 ES
模块标准之前出现
-
命名空间在
TypeScript
早期时,称之为内部模块,目的是将一个模块内部再进行作用域的划分,防止一些命名冲突的问题 -
虽然命名空间没有被废弃,但是由于
ES
模块已经拥有了命名空间的大部分特性,因此更推荐使用ES
模块,这样才能与JavaScript
的(发展)方向保持一致 -
namespace
:关键字,用于声明一个命名空间 -
export
:将变量、函数或类导出到命名空间外,以便外部可以访问它们
// 基本语法
namespace MyNamespace {
export const name: string = 'TypeScript';
export function greet() {
console.log('Hello from', name);
}
export class Person {
constructor(public name: string) {}
}
}
// 使用命名空间
MyNamespace.greet(); // 输出: Hello from TypeScript
const person = new MyNamespace.Person('Alice');
console.log(person.name); // 输出: Alice
// 嵌套语法
namespace MyNamespace {
export namespace Utils {
export function logMessage(message: string) {
console.log('Log:', message);
}
}
}
MyNamespace.Utils.logMessage('This is a message'); // 输出: Log: This is a message
// 嵌套语法别名使用
import Utils = MyNamespace.Utils;
Utils.logMessage('Using alias'); // 输出: Log: Using alias
类型查找
之前我们所有的typescript
中的类型,几乎都是我们自己编写的,但是也有用到一些其他的类型,我们看下 typescript
对类型的管理和查找规则:
-
一种
.d.ts
文件,它是用来做类型的声明(declare
),称之为类型声明(Type Declaration
)或者类型定义(Type Definition
)文件 -
它仅仅用来做类型检测,告知
typescript
我们有哪些类型 -
typescript
会查找这些类型声明:-
内置类型声明
-
外部定义类型声明
-
自己定义类型声明
-
内置类型
内置类型声明是typescript
自带的、帮助我们内置了JavaScript
运行时的一些标准化API
的声明文件
-
包括比如
Function、String、Math、Date
等内置类型 -
包括运行环境中的
DOM API
,比如Window、Document
等 -
TypeScript
使用模式命名这些声明文件lib.[something].d.ts
-
内置类型声明通常在我们安装
typescript
的环境中会带有的:https://github.com/microsoft/TypeScript/tree/main/lib -
可以通过
target
和lib
来决定哪些内置类型声明是可以使用的,例如startsWith
字符串方法只能从称为ECMAScript 6
的JavaScript
版本开始使用 -
可以通过
target
的编译选项来配置:TypeScript
通过lib
根据您的target
设置更改默认包含的文件来帮助解决此问题 https://www.typescriptlang.org/tsconfig#lib
外部定义声明
外部类型声明通常是我们使用一些库(比如第三方库)时,需要的一些类型声明
这些库通常有两种类型声明方式:
-
方式一:在自己库中进行类型声明(编写
.d.ts
文件),比如axios
-
方式二:通过社区的一个公有库
DefinitelyTyped
存放类型声明文件
-
该库的
GitHub
地址:https://github.com/DefinitelyTyped/DefinitelyTyped/ -
该库查找声明安装方式的地址:https://www.typescriptlang.org/dt/search?search=
-
比如安装
react
的类型声明:npm i @types/react --save-dev
-
第三方库
什么情况下需要自己来定义声明文件呢?
-
情况一:使用的第三方库是一个纯的
JavaScript
库,没有对应的声明文件,比如lodash
-
情况二:给自己的代码中声明一些类型,方便在其他地方直接进行使用
自定义声明
也可以声明模块,比如lodash
模块默认不能使用的情况,可以自己来声明这个模块
-
declare
声明模块:
declare module '模块名' {}
,在声明模块的内部,可以通过export
导出对应库的类、函数等// XXX.d.ts declare module 'lodash' { export function join(args: any[]): any } // XXX.ts import type { IFoo, IDType } from "./type/index"; import axios from 'axios' import lodash from 'lodash' lodash.join(['11', '22']) const id: IDType = 12121212121 const foo: IFoo = { name: 'foo', age: 18 }
-
declare
声明文件:-
比如在开发
vue
的过程中,默认是不识别.vue
文件的,那么就需要对其进行文件的声明
-
比如在开发中使用了
jpg
这类图片文件,默认typescript
也是不支持的,也需要对其进行声明
// XXX.d.ts declare module 'lodash' { export function join(args: any[]): any } declare module '*.vue' { import { DefineComponent } from 'vue' const component: DefineComponent export default component } declare module '*.jpg' { const src: string export default src }
-
-
declare
命名空间:
比如在index.html
中直接引入了jQuery
:https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js 可以进行命名空间的声明
// XXX.d.ts declare module 'lodash' { export function join(args: any[]): any } declare module '*.vue' { import { DefineComponent } from 'vue' const component: DefineComponent export default component } declare module '*.jpg' { const src: string export default src } declare namespace $ { function ajax(setting: any): void }
tsconfig.json
文件
当目录中出现了 tsconfig.json
文件,则说明该目录是 TypeScript
项目的根目录,tsconfig.json
文件指定了编译项目所需的根目录下的文件以及编译选项
tsconfig.json
文件有两个作用:
-
作用一:让
TypeScript Compiler
在编译的时候,知道如何去编译TypeScript
代码和进行类型检测 -
作用二:让编辑器(比如
VSCode
)可以按照正确的方式识别TypeScript
代码,对于哪些语法进行提示、类型错误检测等等
tsconfig.json
在编译时如何被使用呢?
-
在调用
tsc
命令并且没有其它输入文件参数时,编译器将由当前目录开始向父级目录寻找包含tsconfig
文件的目录 -
调用
tsc
命令并且没有其他输入文件参数,可以使用--project
(或者只是-p
)的命令行选项来指定包含了tsconfig.json
的目录 -
当命令行中指定了输入文件参数,
tsconfig.json
文件会被忽略
tsconfig.json
文件包括哪些选项呢?
-
tsconfig.json
本身包括的选项非常非常多,不需要每一个都记住 -
可以查看文档对于每个选项的解释:https://www.typescriptlang.org/tsconfig
-
当开发项目的时候,选择
TypeScript
模板时,tsconfig
文件默认都会配置好 -
下图是常见的一些配置:
在Vue项目中应用
具体学习这篇文章:待后面补充
在React项目中应用
具体学习这篇文章:待后面补充