文章目录
- 前言
- `Record<string, any>`
- Record 的语法
- 使用示例
- 在你的代码中的应用
- 示例代码
前言
学习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
将是一个具有 name
、age
和 gender
属性的对象类型,这些属性的值可以是字符串或数字。
Record
类型常用于以下场景:
- 将一组键映射到相同的值类型:这在创建配置对象或枚举类似对象时特别有用。
- 类型安全的属性访问:当你在对象上访问属性时,TypeScript 会确保你访问的属性是类型定义中存在的。
- 创建泛型工厂函数或类:可以创建一个通用的函数或类,它根据输入的键类型和值类型生成特定的对象类型。
例如,你可以创建一个工厂函数,它接受键和值的类型参数,并返回一个具有这些键和值的对象:
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
是键的类型,通常是string
、number
或symbol
,但也可以是任何可以作为对象键的类型。T
是值的类型,可以是任何类型。
使用示例
- 基本使用
type User = {id: number;name: string;
};let userRecord: Record<string, User> = {user1: { id: 1, name: "John" },user2: { id: 2, name: "Jane" },
};
在这个例子中,userRecord
是一个对象,其中键是字符串类型,而值是 User
类型的对象。
- 结合
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>
,你可以确保 key
在 filteredObj
中是合法的,并且 filteredObj[key]
的值可以是任何类型。这样,TypeScript 可以正确推断并检查代码类型。