TypeScript 5.x 高级技巧:类型体操入门指南
TypeScript 的类型系统图灵完备,这意味着理论上你可以用它来计算任何东西。别被"类型体操"这个词吓到,让我们从实际场景出发。
为什么需要类型体操?
当你的项目规模增长,简单的 interface 和 type 可能不够用。你需要:
- 从已有类型推导出新类型
- 根据条件动态改变类型
- 确保 API 响应的类型安全
实用技巧
条件类型
type IsString<T> = T extends string ? true : false
type A = IsString<'hello'> // true
type B = IsString<42> // false
模板字面量类型
TypeScript 4.1 引入的模板字面量类型非常强大:
type EventName<T extends string> = `on${Capitalize<T>}`
type ClickEvent = EventName<'click'> // 'onClick'
映射类型与 infer
type PromiseType<T> = T extends Promise<infer U> ? U : never
type Result = PromiseType<Promise<string>> // string
实战案例:类型安全的 API 调用
结合条件类型和泛型约束,你可以构建完全类型安全的 API 层:
type ApiResponse<T> = {
data: T
error: null
} | {
data: null
error: string
}
async function fetchApi<T>(url: string): Promise<ApiResponse<T>> {
// 实现...
}
不要过度使用
类型体操很有趣,但过度使用会让代码难以维护。记住:类型是为业务服务的。如果一个类型让同事看了五分钟还看不懂,那就该简化了。
类型系统的极致运用,让代码更加健壮。
