返回

赋能 AI,掌握深度学习 TypeScript 之内置工具类手写秘籍

前端

在深度学习中,构建可靠而高效的模型是一项艰巨的任务。TypeScript 作为一种强大的类型化语言,凭借其类型系统和广泛的内置工具类型,为 AI 开发者提供了坚实的基础。本文将带领你深入探索 TypeScript 中的内置工具类,理解其工作原理,并通过手写这些工具类型来掌握构建复杂类型的能力。

TypeScript 提供了丰富的内置工具类型,包括 Partial、Required、Readonly、Pick、Omit、Exclude、NonNullable、ReturnType、Parameters、ConstructorParameters 等。这些工具类型可以帮助我们构建更加强大且灵活的类型,从而提高代码的可读性、可维护性和可重用性。

让我们从一个简单的 Partial 工具类型开始。Partial 可以将一个类型的每个属性都标记为可选属性。例如,我们有一个 Person 类型,其中包含 name、age 和 address 属性。我们可以使用 Partial 将 Person 类型转换为 Partial 类型,这样我们就可以只传递 Person 类型的部分属性,而不需要全部传递。

interface Person {
  name: string;
  age: number;
  address: string;
}

const person: Partial<Person> = {
  name: 'John Doe'
};

Required 工具类型与 Partial 工具类型相反。它可以将一个类型的每个属性都标记为必填属性。例如,我们可以使用 Required 将 Person 类型转换为 Required 类型,这样我们就必须传递 Person 类型的全部属性,否则就会产生错误。

interface Person {
  name: string;
  age: number;
  address: string;
}

const person: Required<Person> = {
  name: 'John Doe',
  age: 30,
  address: '123 Main Street'
};

Readonly 工具类型可以将一个类型的每个属性都标记为只读属性。例如,我们可以使用 Readonly 将 Person 类型转换为 Readonly 类型,这样我们就不能修改 Person 类型的任何属性,否则就会产生错误。

interface Person {
  name: string;
  age: number;
  address: string;
}

const person: Readonly<Person> = {
  name: 'John Doe',
  age: 30,
  address: '123 Main Street'
};

person.name = 'Jane Doe'; // Error: Cannot assign to 'name' because it is a read-only property.

Pick 工具类型可以从一个类型中选取指定的属性,并创建一个新的类型。例如,我们可以使用 Pick 将 Person 类型转换为 Pick<Person, 'name' | 'age'> 类型,这样我们就只能访问 Person 类型的 name 和 age 属性,而不能访问 address 属性。

interface Person {
  name: string;
  age: number;
  address: string;
}

const person: Pick<Person, 'name' | 'age'> = {
  name: 'John Doe',
  age: 30
};

person.address; // Error: Property 'address' does not exist on type 'Pick<Person, "name" | "age">'.

Omit 工具类型与 Pick 工具类型相反。它可以从一个类型中排除指定的属性,并创建一个新的类型。例如,我们可以使用 Omit 将 Person 类型转换为 Omit<Person, 'address'> 类型,这样我们就只能访问 Person 类型的 name 和 age 属性,而不能访问 address 属性。

interface Person {
  name: string;
  age: number;
  address: string;
}

const person: Omit<Person, 'address'> = {
  name: 'John Doe',
  age: 30
};

person.address; // Error: Property 'address' does not exist on type 'Omit<Person, "address">'.

Exclude 工具类型可以从一个类型中排除另一个类型的属性,并创建一个新的类型。例如,我们可以使用 Exclude 将 Person 类型转换为 Exclude<Person, 'address'> 类型,这样我们就只能访问 Person 类型的 name 和 age 属性,而不能访问 address 属性。

interface Person {
  name: string;
  age: number;
  address: string;
}

const person: Exclude<Person, 'address'> = {
  name: 'John Doe',
  age: 30
};

person.address; // Error: Property 'address' does not exist on type 'Exclude<Person, "address">'.

NonNullable 工具类型可以从一个类型中排除所有为 null 或 undefined 的属性,并创建一个新的类型。例如,我们可以使用 NonNullable 将 Person 类型转换为 NonNullable 类型,这样我们就只能访问 Person 类型的 name、age 和 address 属性,而不能访问 null 或 undefined 属性。

interface Person {
  name: string | null;
  age: number | undefined;
  address: string | undefined;
}

const person: NonNullable<Person> = {
  name: 'John Doe',
  age: 30,
  address: '123 Main Street'
};

person.name = null; // Error: Cannot assign 'null' to 'name' because it is a non-nullable property.

ReturnType 工具类型可以获取一个函数的返回值类型。例如,我们可以使用 ReturnType 将 getPersonName 函数的返回值类型转换为 ReturnType 类型,这样我们就能够知道 getPersonName 函数返回一个字符串。

function getPersonName(person: Person): string {
  return person.name;
}

const personName: ReturnType<getPersonName> = getPersonName({
  name: 'John Doe',
  age: 30,
  address: '123 Main Street'
});

Parameters 工具类型可以获取一个函数的参数类型。例如,我们可以使用 Parameters 将 getPersonName 函数的参数类型转换为 Parameters 类型,这样我们就能够知道 getPersonName 函数接受一个 Person 类型参数。

function getPersonName(person: Person): string {
  return person.name;
}

const personName: Parameters<getPersonName> = [{
  name: 'John Doe',
  age: 30,
  address: '123 Main Street'
}];

ConstructorParameters 工具类型可以获取一个构造函数的参数类型。例如,我们可以使用 ConstructorParameters 将 Person 构造函数的参数类型转换为 ConstructorParameters 类型,这样我们就能够知道 Person 构造函数接受两个参数,一个是字符串,另一个是数字。

class Person {
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}

const person: ConstructorParameters<Person> = ['John Doe', 30];

这些只是 TypeScript 内置工具类型中的一小部分。通过掌握这些工具类型,你将能够构建更加强大、灵活和可重用的类型,从而提高你的 TypeScript 开发效率和代码质量。