TypeScript 本身并没有独立的标准库,但它提供了对 JavaScript 标准库的完整类型定义,并且有一个丰富的类型系统来增强 JavaScript 的开发体验。
📚 TypeScript 的"标准库"组成 #
组成部分 | 描述 | 示例 |
---|---|---|
JavaScript 标准库类型 | TypeScript 包含了 ES5、ES6+ 所有内置对象的类型定义 | Array<T> , Promise<T> , Map<K, V> |
DOM API 类型 | 浏览器环境下的 DOM API 类型定义 | document , window , HTMLElement |
TypeScript 补充类型 | TypeScript 特有的类型工具 | Partial<T> , Pick<T, K> , Record<K, V> |
@types/node | Node.js 环境的标准库类型定义(需单独安装) | fs , path , http 等模块的类型 |
🔧 TypeScript 的内置类型定义 #
TypeScript 自带了对 JavaScript 标准库的完整类型定义,这些定义文件位于 TypeScript 安装目录的 lib
文件夹中。
1. JavaScript 内置对象类型 #
TypeScript 为所有 JavaScript 内置对象提供了类型支持:
// 数组类型
const numbers: Array<number> = [1, 2, 3];
const strings: string[] = ['a', 'b', 'c'];
// Promise 类型
const fetchData: Promise<string> = fetch('/api/data').then(res => res.text());
// Map 和 Set
const map: Map<string, number> = new Map();
map.set('age', 25);
const set: Set<number> = new Set([1, 2, 3]);
// Date 类型
const now: Date = new Date();
2. 实用类型工具 (Utility Types) #
TypeScript 提供了一系列实用类型工具,用于常见类型转换操作:
interface User {
id: number;
name: string;
email: string;
age: number;
}
// Partial - 所有属性变为可选
type PartialUser = Partial<User>;
// 等价于 { id?: number; name?: string; email?: string; age?: number; }
// Readonly - 所有属性变为只读
type ReadonlyUser = Readonly<User>;
// Pick - 选择部分属性
type UserNameAndEmail = Pick<User, 'name' | 'email'>;
// Omit - 忽略部分属性
type UserWithoutEmail = Omit<User, 'email'>;
// Record - 创建键值对类型
type UserDictionary = Record<string, User>;
🌐 环境特定的类型定义 #
1. 浏览器环境 (DOM API) #
TypeScript 包含了完整的 DOM API 类型定义:
// DOM 操作
const element: HTMLElement | null = document.getElementById('my-element');
// 事件处理
element?.addEventListener('click', (event: MouseEvent) => {
console.log(event.clientX, event.clientY);
});
// 使用 Fetch API
async function fetchData(url: string): Promise<any> {
const response: Response = await fetch(url);
return response.json();
}
2. Node.js 环境 #
对于 Node.js 开发,需要安装 @types/node
包来获取 Node.js 标准库的类型定义:
npm install --save-dev @types/node
安装后,你可以使用所有 Node.js 内置模块的类型:
import * as fs from 'fs';
import * as path from 'path';
import * as http from 'http';
// 使用 Node.js 模块 with TypeScript
const readFile = (filePath: string): Promise<string> => {
return new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) reject(err);
else resolve(data);
});
});
};
// 使用 path 模块
const fullPath: string = path.join(__dirname, 'file.txt');
⚙️ 配置 TypeScript 的标准库 #
通过 tsconfig.json
中的 lib
选项,你可以指定 TypeScript 应该包含哪些标准库定义:
{
"compilerOptions": {
// 包含 ES2015 和 DOM 的定义
"lib": ["ES2015", "DOM"],
// 或者针对不同环境
"lib": ["ES2020"], // 仅包含 ECMAScript 特性,不含 DOM
// 针对 Node.js
"lib": ["ES2020"],
"module": "commonjs",
"target": "ES2020"
}
}
常用的 lib
配置选项:
ES5
,ES6
/ES2015
,ES2016
,ES2017
,ES2018
,ES2019
,ES2020
,ESNext
DOM
,DOM.Iterable
WebWorker
,ScriptHost
📦 DefinitelyTyped - 社区维护的类型定义 #
对于非 JavaScript 标准库的第三方库,TypeScript 社区维护了 DefinitelyTyped 项目,提供了数千个流行库的类型定义。
使用方式:
# 安装 React 的类型定义
npm install --save-dev @types/react @types/react-dom
# 安装 Lodash 的类型定义
npm install --save-dev @types/lodash
# 安装 Jest 的类型定义
npm install --save-dev @types/jest
🛠️ 创建自定义类型定义 #
当库没有提供类型定义时,你可以创建自己的 .d.ts
文件:
// types/my-library.d.ts
declare module 'my-untyped-library' {
export function doSomething(input: string): number;
export interface Options {
enabled: boolean;
timeout: number;
}
}
💡 总结 #
- TypeScript 没有独立的标准库,而是为 JavaScript 标准库提供类型支持
- 包含 ES5/ES6+ 所有内置对象的完整类型定义
- 提供 DOM API 的完整类型定义(浏览器环境)
- 通过
@types/node
提供 Node.js 标准库类型定义 - 提供实用类型工具(Utility Types)增强类型系统
- 有一个丰富的生态系统(DefinitelyTyped)为第三方库提供类型定义
- 可以通过
tsconfig.json
的lib
选项配置使用的标准库
这种设计使得 TypeScript 能够灵活地适应各种 JavaScript 运行环境(浏览器、Node.js、Deno等),同时为开发者提供一致且强大的类型安全保障。