获课 》www.bcwit.top/177/
一、筑基篇:TypeScript 核心语法体系
(一)TypeScript 基础语法速通
1. 类型系统基础
typescript
// 基础类型 let num: number = 42; // 数字类型 let str: string = "Hello TS"; // 字符串类型 let bool: boolean = true; // 布尔类型 let list: number[] = [1, 2, 3]; // 数组类型 let obj: { name: string; age: number } = { name: "Alice", age: 30 }; // 对象类型 // 联合类型与交叉类型 function add(a: number | string, b: number | string): number { return typeof a === 'number' && typeof b === 'number' ? a + b : 0; } type Admin = { role: 'admin' }; type User = { role: 'user' } & { age: number }; // 交叉类型
2. 类型断言与非空断言
typescript
// 类型断言(两种形式) const el = document.getElementById('app')!; // 非空断言 const input = el as HTMLInputElement; // 类型断言 const input2: HTMLInputElement = el; // 尖括号语法(仅限非JSX环境) // 类型断言 vs 类型转换 // TS不执行运行时类型检查,断言是开发时类型提示
(二)接口与类型别名深度对比
typescript
// 接口合并 interface User { name: string; } interface User { age: number; } // 合并为 { name:string; age:number; } // 类型别名 type Callback = (data: any) => void; type Pair = [T, T]; // 元组类型别名
二、进阶篇:类型系统深度解析
(一)泛型编程实战
1. 泛型函数与泛型类
typescript
// 泛型函数 function reverse(items: T[]): T[] { return items.reverse(); } const numbers = reverse([1, 2, 3]); // 显式指定类型 const strings = reverse(['a', 'b', 'c']); // 类型推断 // 泛型类 class Queue { private data: T[] = []; enqueue(item: T) { this.data.push(item); } dequeue(): T | undefined { return this.data.shift(); } } const numberQueue = new Queue();
2. 泛型约束与条件类型
typescript
// 泛型约束(继承接口) interface Lengthable { length: number; } function loggingIdentity(arg: T): T { console.log(arg.length); return arg; } // 条件类型(Type Guards) type TypeName = T extends string ? 'string' : T extends number ? 'number' : T extends boolean ? 'boolean' : 'object'; // 分布式条件类型(自动拆分联合类型) type ToString = T extends any ? `${T}` : never;
(二)高级类型魔法
1. 映射类型与模板字面量
typescript
// 映射类型(基于已有类型创建新类型) type ReadonlyProps = { readonly [P in keyof T]: T[P] }; type PartialProps = { [P in keyof T]?: T[P] }; // 模板字面量类型(字符串类型操作) type EventNames = `on${Capitalize}`; interface UserEvents { click: () => void; submit: () => void; } type Event = EventNames; // "onClick" | "onSubmit"
2. 条件类型高级应用
typescript
// 提取类型(Extract)与排除类型(Exclude) type NonString = Exclude; type StringOnly = Extract; // 逆变与协变(函数参数类型的方差) interface Animal { name: string; } interface Dog extends Animal { breed: string; } // 协变(返回值类型可扩展) const getPet: () => Dog = () => ({ name: 'Buddy', breed: 'Golden Retriever' }); // 逆变(参数类型可收缩) const handleEvent: (event: Animal) => void = (event) => {}; handleEvent(new Dog()); // 允许逆变
三、工程篇:TypeScript 项目实战
(一)TS 配置文件深度解析
typescript
// tsconfig.json核心配置 { "compilerOptions": { "target": "ES2020", // 编译目标 "module": "ESNext", // 模块系统 "strict": true, // 严格类型检查模式 "esModuleInterop": true, // 兼容CommonJS模块 "skipLibCheck": true, // 跳过库文件类型检查 "baseUrl": "./src", // 路径映射 "paths": { "@/*": ["utils/*"] } // 别名配置 }, "include": ["src/**/*.ts"], "exclude": ["node_modules"] }
(二)React+TypeScript 最佳实践
1. 组件类型定义
typescript
// 函数组件带Props类型 interface ButtonProps { onClick: (event: React.MouseEvent) => void; disabled?: boolean; } const Button: React.FC = ({ onClick, disabled = false, children }) => ( {children} ); // 类组件带State类型 class Counter extends React.Component<{}, count: number> { state = { count: 0 }; render() { return
{this.state.count}
; } }
2. 自定义 Hook 类型
typescript
function useLocalStorage(key: string, initialValue: T): [T, (value: T) => void] { const [storedValue, setStoredValue] = useState(() => { try { return JSON.parse(localStorage.getItem(key) || String(initialValue)); } catch { return initialValue; } }); const setValue = (value: T | ((val: T) => T)) => { const valueToStore = value instanceof Function ? value(storedValue) : value; localStorage.setItem(key, JSON.stringify(valueToStore)); setStoredValue(valueToStore); }; return [storedValue, setValue]; } // 使用时自动推导类型 const [theme, setTheme] = useLocalStorage('theme', 'light'); // string类型
四、高手篇:TypeScript 深度优化
(一)类型检查性能优化
增量编译:开启incremental选项(默认开启),利用缓存提升编译速度
禁用不必要检查:noImplicitAny设为 false(谨慎使用,仅在遗留代码过渡时)strictNullChecks设为 false(非严格空值检查模式)
使用 Babel 与 TS 联合编译:
bash
# 分工:TS负责类型检查,Babel负责转译 npx tsc --noEmit && npx babel src --out-dir dist
(二)类型体操实战:实现复杂类型
1. 实现 Pick 类型(选取部分属性)
typescript
type MyPick = { [P in K]: T[P] }; interface User { id: number; name: string; age: number; } type UserInfo = MyPick; // { name:string; age:number; }
2. 实现 DeepReadonly(深度只读)
typescript
type DeepReadonly = T extends object ? T extends Function ? T : { readonly [P in keyof T]: DeepReadonly } : T; const data: DeepReadonly<{ a: b: number> = { a: { b: 1 } }; data.a.b = 2; // 报错:属性是只读的
五、实战篇:全栈项目类型安全实践
(一)Node.js API 服务类型定义
1. Express 路由参数类型
typescript
import express from 'express'; const router = express.Router(); interface UserParams { userId: string } interface UserBody { name: string; age: number } router.post( '/users/:userId', (req, res) => { const { userId } = req.params; // 自动推断为string const { name, age } = req.body; // 自动推断为{ name:string; age:number } res.send(`User ${userId} created: ${name}, ${age}`); } );
2. TypeORM 实体定义
typescript
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column({ unique: true }) email: string; @Column({ select: false }) // 查询时默认不返回 password: string; } // 类型安全的Repository操作 const userRepository = connection.getRepository(User); const user = await userRepository.findOne({ where: { email: 'test@example.com' } }); user.password; // 类型提示:此属性在查询时被排除
(二)工具库开发:类型安全的函数式编程
typescript
// 实现类型安全的pipe函数 type Pipe = (f: (a: A) => B, g: (b: B) => C, h: (c: C) => D) => (a: A) => D; const pipe: Pipe = (f, g, h) => a => h(g(f(a))); // 使用示例 const add1 = (x: number) => x + 1; const double = (x: number) => x * 2; const toString = (x: number) => x.toString(); const process = pipe(add1, double, toString); process(3); // "8"(类型安全推导)
六、避坑指南:常见问题解决方案
(一)类型推断陷阱
上下文类型推断失效:
typescript
// 错误:无法推断T类型 function createArray(length: number, value: T): T[] { return new Array(length).fill(value); } // 正确:显式指定类型或使用泛型约束 function createArray(length: number, value: T): T[] { return Array.from({ length }, () => value); // 使用Array.from避免fill的类型问题 }
联合类型赋值问题:
typescript
let value: string | number = 'hello'; value = 42; // 合法 value = true; // 错误:类型“boolean”不能分配给类型“string | number”
(二)兼容性处理
第三方库类型声明缺失:创建@types/xxx声明文件(如果不存在)使用declare module扩展现有类型
typescript
declare module 'custom-library' { export function customFunc(): string; }
ES6 + 特性支持:设置lib选项包含目标运行时(如 ["ES2020", "DOM"])使用@types包补充缺失的类型定义(如@types/lodash)
七、TypeScript 最新特性(2025 年)
(一)4.9 版本新特性
模板字面量类型改进:
typescript
type FileName<T extends string> = T extends `${infer P}.${infer S}` ? S : never; type Ext = FileName<'index.html'>; // "html"(支持更复杂的模式匹配)
装饰器元数据改进:
typescript
// 支持在装饰器中访问类的类型参数 function Logged<T extends new (...args: any[]) => any>(constructor: T) { const typeParameters = Reflect.getMetadata('design:typeParameters', constructor); }
(二)5.0 + 版本前瞻
更智能的类型推断:支持在条件类型中推断父类型参数改进函数重载解析逻辑
与 JavaScript 的互操作性增强:自动生成.d.ts 声明文件(基于 JSDoc 注释)更宽松的类型兼容性检查模式
八、学习资源与成长路径
(一)优质学习资料
官方文档:TypeScript Handbook(必看)
经典书籍:《深入理解 TypeScript》《TypeScript 设计模式》
实战项目:DefinitelyTyped(贡献类型声明)参与开源项目的 TypeScript 重构
(二)职业发展路线
plaintext
初级开发者(0-1年) 掌握基础语法与类型标注 中级开发者(1-3年) 精通泛型/接口/高级类型 高级开发者(3年+) 主导大型项目类型架构设计
(三)日常提效工具
VSCode 插件:TypeScript Toolbox(快速生成类型定义)Error Lens(实时显示类型错误)
类型检查工具:tsc --noEmit --strict(纯类型检查)ESLint 插件@typescript-eslint/eslint-plugin(代码风格与类型检查结合)
领取专属 10元无门槛券
私享最新 技术干货