TypeScript 进阶必修课:解锁强大的内置工具类型(一)

核心工具类型

1. Partial<T>: 让所有属性变为可选

  • 作用: 构造一个类型,使其属性都变为可选。

示例:

php 复制代码
```typescript
interface User {
    id: number;
    name: string;
    email: string;
}

// 假设我们要更新用户,可能只修改姓名或邮箱
type PartialUser = Partial<User>;
/* 等同于:
type PartialUser = {
    id?: number;
    name?: string;
    email?: string;
}
*/

function updateUser(id: number, changes: PartialUser) {
    // ... 调用 API 更新数据库
    console.log(`Updating user ${id} with:`, changes);
}

updateUser(1, { name: 'Alice' }); // ✅ 只传入部分属性
updateUser(2, { email: 'bob@example.com' }); // ✅
```

2. Required<T>: 让所有属性变为必选

  • 作用: 构造一个类型,使其所有属性都变为必选。

示例:

ini 复制代码
```typescript
interface Product {
    id: string;
    name: string;
    description?: string; // 描述是可选的
    price: number;
}

// 有时,我们需要确保所有字段都存在,例如在提交表单前
type CompleteProduct = Required<Product>;
/* 等同于:
type CompleteProduct = {
    id: string;
    name: string;
    description: string; // 现在是必选的
    price: number;
}
*/

const newProduct: CompleteProduct = {
    id: 'p001',
    name: '电视',
    description: '最新的电视', // 现在必须提供
    price: 999.99,
    //description: '最新的电视', // 现在必须提供
};
const incompleteProduct: CompleteProduct = { id: "p002", name: "Monitor", price: 299.99 }; // error: 缺少 'description' 属性

```

3. Readonly<T>: 让所有属性变为只读

  • 作用: 构造一个类型,使其所有属性都变为只读 (Immutable)。

示例:

vbnet 复制代码
```typescript
interface AppConfig {
    version: string;
    apiUrl: string;
    debugMode: boolean;
}

const config: Readonly<AppConfig> = {
    version: '1.0.0',
    apiUrl: 'https://api.example.com',
    debugMode: false,
};

// config.version = "1.0.1"; // error:无法分配到 "version" ,因为它是一个只读属性。
```

4. Pick<T, K>: 挑选指定属性

  • 作用: 从类型 T 中挑选出由 K 指定的(字面量联合类型)属性,来构造一个新的类型。

示例:

ini 复制代码
```typescript
interface UserDetails {
    id: number;
    username: string;
    email: string;
    avatarUrl: string;
    createdAt: Date;
}

// 我们可能只需要用户的公共个人资料信息
type UserProfile = Pick<UserDetails, 'id' | 'username' | 'avatarUrl'>;
/* 等同于:
type UserProfile = {
    id: number;
    username: string;
    avatarUrl: string;
}
*/

const profile: UserProfile = {
    id: 1,
    username: 'john_doe',
    avatarUrl: 'https://example.com/avatar1.png',
};
```

5. Omit<T, K>: 排除指定属性

  • 作用: 从类型 T 中排除由 K 指定的(字面量联合类型)属性,来构造一个新的类型。它是 Pick 的反向操作。

示例:

ini 复制代码
```typescript
interface BlogPost {
    id: number;
    title: string;
    content: string;
    authorId: number;
    createdAt: Date;
    updatedAt: Date;
}

// 创建新博客时,id、createdAt 和 updatedAt 通常是自动生成的,不需要提供
type CreateBlogPostDto = Omit<BlogPost, 'id' | 'createdAt' | 'updatedAt'>;
/* 等同于:
type CreateBlogPostDto = {
    title: string;
    content: string;
    authorId: number;
}
*/

const newPost: CreateBlogPostDto = {
    title: 'My First Blog Post',
    content: 'Hello world!',
    authorId: 101,
};

```

6. Record<K, T>: 构造字典类型

  • 作用: 构造一个对象类型,其属性键是 K 类型,属性值是 T 类型。

  • 示例:

    typescript 复制代码
    type Fruit = 'apple' | 'banana' | 'orange';
    
    // 定义一个水果价格表
    type FruitPrices = Record<Fruit, number>;
    /* 等同于:
    type FruitPrices = {
        apple: number;
        banana: number;
        orange: number;
    }
    */
    
    const prices: FruitPrices = {
        apple: 1.2,
        banana: 0.75,
        orange: 1.2,
    };

总结

如果你喜欢本教程,记得点赞+收藏!关注我获取更多JavaScript/TypeScript开发干货

相关推荐
benbenAItalk11 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_9628857212 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎123412 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
多加点辣也没关系12 小时前
JavaScript|第31章:表单与控件
开发语言·javascript·ecmascript
陈随易14 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
水域安全老周14 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师15 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing9815 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
Highcharts.js15 小时前
常见报错排雷指南2:导出失败的官方解法
javascript·react.js·ecmascript·highcharts·可视化图表·导出模块失败·导出服务