TypeScript-内置应用程序类型-Recode

发布于:2024-07-23 ⋅ 阅读:(157) ⋅ 点赞:(0)


前言

学习TypeScript 内置应用程序类型


在 TypeScript 中,Record 是一个实用类型,它允许你基于一个键的联合类型和一个值的类型,来创建一个新的对象类型。Record<K, T> 接受两个类型参数:第一个参数 K 是键的联合类型,第二个参数 T 是所有键对应的值的类型。

Record<K, T> 的基本语法如下:

Record<KeysUnion, ValueType>

其中 KeysUnion 是一系列可能的键名的联合类型,ValueType 是这些键所对应的值的类型。

例如,假设你有一个键的联合类型 Keys 和一个值的类型 Value,你可以使用 Record 创建一个类型,该类型表示一个对象,其键是 Keys 中的一个,值是 Value 类型:

type Keys = 'name' | 'age' | 'gender';
type Value = string | number;

type MyRecordType = Record<Keys, Value>;

const example: MyRecordType = {
  name: 'John Doe',
  age: 30,
  gender: 'male'
};

在这个例子中,MyRecordType 将是一个具有 nameagegender 属性的对象类型,这些属性的值可以是字符串或数字。

Record 类型常用于以下场景:

  1. 将一组键映射到相同的值类型:这在创建配置对象或枚举类似对象时特别有用。
  2. 类型安全的属性访问:当你在对象上访问属性时,TypeScript 会确保你访问的属性是类型定义中存在的。
  3. 创建泛型工厂函数或类:可以创建一个通用的函数或类,它根据输入的键类型和值类型生成特定的对象类型。

例如,你可以创建一个工厂函数,它接受键和值的类型参数,并返回一个具有这些键和值的对象:

function createRecord<K extends string, V>(keys: K[], values: V[]): Record<K, V> {
  return keys.reduce((obj, key, index) => ({ ...obj, [key]: values[index] }), {} as Record<K, V>);
}

const record = createRecord(['a', 'b', 'c'], [1, 2, 3]);

在这个例子中,createRecord 函数接收键和值的数组,然后返回一个使用 Record 构造的对象类型,该类型确保了键和值的类型一致性。

Record 是 TypeScript 中一个强大的类型工具,它可以帮助你创建类型安全的对象,特别是在处理键值对集合时。

Record<string, any>

Record<string, any> 是 TypeScript 中的一个实用程序类型,它用于定义一个对象,该对象的键是字符串类型,而键对应的值可以是任何类型。Record 是 TypeScript 中提供的内置泛型类型之一,常用于定义对象类型的快捷方式。

Record 的语法

type Record<K extends keyof any, T> = {
  [P in K]: T;
};
  • K 是键的类型,通常是 stringnumbersymbol,但也可以是任何可以作为对象键的类型。
  • T 是值的类型,可以是任何类型。

使用示例

  1. 基本使用
type User = {
  id: number;
  name: string;
};

let userRecord: Record<string, User> = {
  user1: { id: 1, name: "John" },
  user2: { id: 2, name: "Jane" },
};

在这个例子中,userRecord 是一个对象,其中键是字符串类型,而值是 User 类型的对象。

  1. 结合 any 类型

在你的例子中,Record<string, any> 表示一个对象,该对象的键是字符串,值可以是任何类型。

const obj: Record<string, any> = {
  key1: "value1",
  key2: 123,
  key3: { nestedKey: "nestedValue" },
};

在你的代码中的应用

在你的代码中,使用 Record<string, any> 来明确 filteredObj 的类型,这样 TypeScript 就知道 filteredObj 是一个对象,它的键是字符串,值可以是任何类型。这有助于消除类型检查错误,并确保代码的类型安全性和可维护性。

示例代码

const filteredObj: Record<string, any> = {
  length: 10,
  width: 20,
  height: 30,
  weight: 40,
  pcsPerCarton: 50,
};

const KEYS_TO_COMPARE = ["length", "width", "height", "weight", "pcsPerCarton"];

const resObj = KEYS_TO_COMPARE.reduce((acc, key) => {
  const aValue = filteredObj[key];
  const bValue = filteredObj[key];
  let ratioValue = calculateDifferenceRatio(aValue, bValue);

  if (ratioValue) {
    acc[key] = ratioValue;
  }
  return acc;
}, {} as Record<string, any>);

在这个例子中,通过将 filteredObj 类型显式声明为 Record<string, any>,你可以确保 keyfilteredObj 中是合法的,并且 filteredObj[key] 的值可以是任何类型。这样,TypeScript 可以正确推断并检查代码类型。


网站公告

今日签到

点亮在社区的每一天
去签到