TypeScript — 无标准库

无标准库

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/nodeNode.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.jsonlib 选项配置使用的标准库

这种设计使得 TypeScript 能够灵活地适应各种 JavaScript 运行环境(浏览器、Node.js、Deno等),同时为开发者提供一致且强大的类型安全保障。

本文共 1137 字,创建于 Sep 5, 2025

相关标签: TypeScript, Nodejs, JavaScript