TypeScript 类型系统实战:从基础到高级工具类型
前端工程(更新于 2026年5月24日)
为什么工具站需要 TypeScript?
工具库有 200+ 工具页、4 语言 i18n、复杂的工具客户端配置。纯 JavaScript 在以下场景容易出错:
- 工具配置对象的字段拼写错误
- i18n key 不存在但未报错
- API 响应结构与预期不符
- 重构时遗漏更新引用
TypeScript 在编译期捕获这些错误,而非运行时。
核心类型技巧
1. 类型推断 vs 显式标注
// ✅ 让 TS 推断(简洁)
const tools = [{ href: '/pdf/merge', name: 'PDF合并' }] as const;
// ✅ 需要约束时显式标注
function getTool(href: string): ToolItem | undefined {
return ALL_TOOLS.find(t => t.href === href);
}
2. 泛型约束
function encode<T extends string | ArrayBuffer>(
input: T
): T extends string ? string : ArrayBuffer {
// 根据输入类型返回不同结果
}
3. 联合类型与类型守卫
type ProcessResult =
| { status: 'success'; data: Blob }
| { status: 'error'; message: string };
function handleResult(result: ProcessResult) {
if (result.status === 'success') {
downloadBlob(result.data); // TS 知道 data 存在
}
}
高级工具类型
Partial、Required、Pick、Omit
type ToolConfig = {
href: string;
name: string;
blurb: string;
i18nKey?: string;
};
type ToolUpdate = Partial<ToolConfig>; // 所有字段可选
type ToolRequired = Required<ToolConfig>; // 所有字段必填
type ToolPreview = Pick<ToolConfig, 'name' | 'blurb'>; // 只取部分
条件类型
type IsString<T> = T extends string ? true : false;
type A = IsString<'hello'>; // true
type B = IsString<42>; // false
映射类型
type Readonly<T> = { readonly [K in keyof T]: T[K] };
type Nullable<T> = { [K in keyof T]: T[K] | null };
JSON → TypeScript 生成
工具库 JSON 转 TypeScript 工具的实现逻辑:
function jsonToTypeScript(json: unknown, name = 'Root'): string {
if (Array.isArray(json)) {
return `${name}[]`;
}
if (typeof json === 'object' && json !== null) {
const fields = Object.entries(json).map(([key, value]) => {
const type = jsonToTypeScript(value, capitalize(key));
return ` ${key}: ${type};`;
});
return `interface ${name} {\n${fields.join('\n')}\n}`;
}
return typeof json; // string | number | boolean
}
输入 API 响应 JSON,一键生成 TypeScript interface——减少手动编写类型的工作量。
实用模式
satisfies 运算符(TS 4.9+)
const config = {
locales: ['zh-CN', 'en'],
defaultLocale: 'zh-CN',
} satisfies RoutingConfig; // 保留字面量类型,同时校验结构
const 类型参数(TS 5.0+)
function createTool<const T extends string>(href: T) {
return { href } as const;
}
const tool = createTool('/pdf/merge'); // href 类型为 '/pdf/merge',非 string
总结
TypeScript 的类型系统不仅是「加类型注解」,更是一套编译期编程语言。掌握泛型、条件类型和工具类型,可以构建自文档化、重构安全的代码库。工具库的 JSON 转 TypeScript 工具则是类型驱动开发的实用起点。
本站提供浏览器本地工具,免注册即可试用 →
#TypeScript#类型系统#泛型#工具类型#工程化