## 适用场景与价值
高级泛型让库与业务模型更具表达力:通过条件类型与 `infer` 可对输入/输出结构进行编译期变换;模板字面量与变长元组让路由、事件、参数列表更精确,减少运行期错误与重构风险。
## 关键能力与示例
### 条件类型与分布式行为
type Nullable<T> = T | null | undefined;
type NonNullableUnion<T> = T extends null | undefined ? never : T;
type A = NonNullableUnion<string | null | number | undefined>; // string | number
type Wrap<T> = [T];
type NonDistributed<T> = Wrap<T> extends [null | undefined] ? never : T; // 防止分布式
### `infer` 提取类型
type Fn = (...args: any[]) => any;
type Return<T extends Fn> = T extends (...args: any[]) => infer R ? R : never;
function make() { return { ok: true, id: 1 } }
type R = Return<typeof make>; // { ok: boolean; id: number }
### 变长元组(Variadic Tuple Types)
type Push<T extends unknown[], U> = [...T, U];
type P = Push<[1, 2], 3>; // [1, 2, 3]
type Concat<A extends unknown[], B extends unknown[]> = [...A, ...B];
type C = Concat<["a"], ["b", "c"]>; // ["a", "b", "c"]
### 模板字面量类型(Template Literal Types)
type Route = `/api/${string}`;
const r1: Route = "/api/user";
type Param<K extends string> = `:${K}`;
type UserParam = Param<"id">; // ":id"
### `const` 类型参数(TS ≥ 5.0)
function defineKeys<const K extends string>(keys: K[]) {
return keys;
}
const ks = defineKeys(["a", "b"]);
type Key = typeof ks[number]; // "a" | "b"(保持字面量)
### 结合内置工具类型
type User = { id: number; name: string; email?: string };
type ReadonlyUser = Readonly<User>;
type RequiredUser = Required<User>;
type Picked = Pick<User, "id" | "name">;
type Selected = Extract<"a" | "b", "b" | "c">; // "b"
## 工程落地与模式
- API 类型变换:用条件类型封装输入/输出变换(如 `Nullable<T>`、`DeepPartial<T>`)。
- 事件/路由:用模板字面量精确描述通道名称与路径,结合 `as const` 固化常量集合。
- 参数列表:通过变长元组表达组合与拼接,让装饰器/中间件签名更精确。
- 泛型保持字面量:使用 `const` 类型参数防止字面量退化为 `string`/`number` 宽类型。
- 分布式避坑:对联合类型的条件判断需要时使用包裹技巧防止分布式行为。
## tsconfig 与版本要求
- `strict: true`:确保控制流与条件类型分析可靠。
- `target: "ES2020"` 及以上:与现代语义一致。
- 语言版本:
- 变长元组:TS ≥ 4.0
- 模板字面量类型:TS ≥ 4.1
- `satisfies`:TS ≥ 4.9
- `const` 类型参数:TS ≥ 5.0
## 常见陷阱与解法
- 条件类型意外分布:通过中间元组包裹防止分布式(如上 `Wrap<T>`)。
- 推断失败:为泛型添加上界(`extends`)或提供占位参数帮助 `infer` 正确工作。
- 宽类型污染:在常量与返回值上使用 `as const` 与 `const` 类型参数。
## 总结
掌握条件类型、`infer`、模板字面量与变长元组等关键能力,可以在不牺牲可读性的前提下显著提升类型表达力与安全性;结合严格配置与规范,能为大型 TypeScript 项目提供更稳健的编译期保障。

发表评论 取消回复