Z
ZHANK
类型编程

映射类型进阶

keyof/extends 约束映射、-?/+? 修饰符、as 键重映射

映射类型进阶

映射类型(Mapped Types)像"类型层面的 map 函数"——遍历联合类型,生成新的属性类型。as 键重映射(TS 4.1+)让映射类型更强大。

学完本章你将: 掌握 keyof/extends 约束映射、-?/+? 修饰符控制、as 键重映射。


基础映射回顾

typescript
type Readonly<T> = {
    readonly [K in keyof T]: T[K];
};

type Optional<T> = {
    [K in keyof T]?: T[K];
};

// -? 移除可选、-readonly 移除只读
type Required<T> = {
    [K in keyof T]-?: T[K];
};

as 键重映射(TS 4.1+)

typescript
// 给所有 key 加前缀
type Prefixed<T, P extends string> = {
    [K in keyof T as `${P}${string & K}`]: T[K];
};

interface User { name: string; age: number; }
type FormUser = Prefixed<User, "form_">;
// { form_name: string; form_age: number; }

// 过滤 key
type OnlyStrings<T> = {
    [K in keyof T as T[K] extends string ? K : never]: T[K];
};

实战:Getter 类型

typescript
type Getters<T> = {
    [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};

interface Person { name: string; age: number; }
type PersonGetters = Getters<Person>;
// { getName: () => string; getAge: () => number; }