TypeScript 语言 映射类型的使用

TypeScriptamuwap 发布于 1 天前 1 次阅读


TypeScript【1】 映射类型【2】:深入理解与实战应用

TypeScript 作为 JavaScript 的超集,提供了丰富的类型系统【3】,使得开发者能够更早地发现潜在的错误,提高代码的可维护性和可读性。在 TypeScript 中,映射类型(Mapped Types)是一种强大的类型操作工具,它允许开发者根据现有类型创建新的类型。本文将深入探讨 TypeScript 映射类型的使用,包括其概念、语法、常用模式以及实战应用。

一、映射类型概述

1.1 什么是映射类型?

映射类型是 TypeScript 中的一种特殊类型,它允许开发者通过一定的规则从现有类型生成新的类型。映射类型通常用于创建泛型【4】类型,使得类型可以根据输入类型动态变化。

1.2 映射类型的语法

映射类型的语法如下:

typescript
T[K]

其中,`T` 是一个类型,`K` 是一个键,可以是字符串或数字。这个表达式表示从类型 `T` 中获取键 `K` 对应的类型。

二、常用映射类型

2.1 `Keyof【5】` 映射类型

`Keyof` 映射类型用于获取一个对象类型的所有键。

typescript
type Person = {
name: string;
age: number;
};

type KeysOfPerson = keyof Person; // 'name' | 'age'

2.2 `Partial【6】` 映射类型

`Partial` 映射类型用于将一个类型的所有属性转换为可选属性。

typescript
type Person = {
name: string;
age: number;
};

type PartialPerson = Partial; // { name?: string; age?: number; }

2.3 `Readonly【7】` 映射类型

`Readonly` 映射类型用于将一个类型的所有属性转换为只读属性。

typescript
type Person = {
name: string;
age: number;
};

type ReadonlyPerson = Readonly; // { readonly name: string; readonly age: number; }

2.4 `Pick【8】` 映射类型

`Pick` 映射类型用于从类型中选取一部分属性。

typescript
type Person = {
name: string;
age: number;
gender: string;
};

type NameAndAge = Pick; // { name: string; age: number; }

2.5 `Record【9】` 映射类型

`Record` 映射类型用于创建一个对象类型,其键是字符串字面量,值是泛型类型。

typescript
type Person = {
name: string;
age: number;
};

type PersonInfo = Record; // { name: string; age: string; }

2.6 `Omit【10】` 映射类型

`Omit` 映射类型用于从类型中排除一部分属性。

typescript
type Person = {
name: string;
age: number;
gender: string;
};

type NameAndGender = Omit; // { name: string; gender: string; }

三、映射类型的实战应用

3.1 创建一个可扩展的配置对象【11】

typescript
type Config = {
[key: string]: any;
};

function createConfig(config: T): Config {
const result: Config = {};
for (const key in config) {
result[key] = config[key];
}
return result;
}

const myConfig = createConfig({
url: 'https://api.example.com',
timeout: 3000,
});

console.log(myConfig); // { url: 'https://api.example.com', timeout: 3000 }

3.2 创建一个响应式数据结构【12】

typescript
type Response = {
data: T;
status: number;
statusText: string;
};

function createResponse(data: T, status: number, statusText: string): Response {
return { data, status, statusText };
}

const response = createResponse({ name: 'Alice', age: 25 }, 200, 'OK');
console.log(response); // { data: { name: 'Alice', age: 25 }, status: 200, statusText: 'OK' }

3.3 创建一个类型安全【13】的表单验证器【14】

typescript
type Form = {
name: string;
email: string;
password: string;
};

type ValidationErrors = {
[K in keyof Form]?: string;
};

function validateForm(form: Form): ValidationErrors {
const errors: ValidationErrors = {};
if (!form.name) {
errors.name = 'Name is required';
}
if (!form.email) {
errors.email = 'Email is required';
}
if (!form.password) {
errors.password = 'Password is required';
}
return errors;
}

const form = { name: '', email: '', password: '' };
const errors = validateForm(form);
console.log(errors); // { name: 'Name is required', email: 'Email is required', password: 'Password is required' }

四、总结

映射类型是 TypeScript 类型系统中的一个重要组成部分,它为开发者提供了强大的类型操作能力。通过理解和使用映射类型,开发者可以创建更加灵活、可扩展和类型安全的代码。本文介绍了映射类型的基本概念、常用模式以及实战应用,希望对读者有所帮助。