TS Record 是 TypeScript 中的一种特殊类型,它允许我们定义一个具有特定属性的对象类型。下面是 TS Record 的用法和示例:
语法:
Record<K, T>
定义一个类型,该类型有一组键值对,其中键的类型为 K,值的类型为 T。
举例:
- 定义记录类型 Record
type PersonalRecord = Record<string, number>; const personRecord: PersonalRecord = { age: 25, height: 180, weight: 75, };
在这个例子中,我们定义了一个 PersonalRecord 类型,它的键是一个字符串类型,值为 number 类型。我们声明了一个 personRecord 变量,并给它赋值一个对象,它包含了 PersonRecord 声明的所有属性。
- 使用 Record 操作字符型映射
const fruitCount: Record<string, number> = { apple: 2, banana: 3, orange: 5, };
在这个例子中,我们使用 Record 类型来定义一个 fruitCount 变量,它是一个字符型映射。键是字符串类型,值是 number 类型。我们定义了一个对象,它包含了三个键值对,表示苹果、香蕉和橙子的数量。
- 使用 Record 操作键值对
type User = { id: number; name: string; email: string; }; // 将 user 变量转换成以 id 为键的对象 const user: User[] = [ { id: 1, name: "Alice", email: "[email protected]" }, { id: 2, name: "Bob", email: "[email protected]" }, ]; const userById: Record<number, User> = user.reduce( (acc, u) => ({ ...acc, [u.id]: u }), {} );
在这个例子中,我们定义了一个 User 类型和一个 user 变量。我们使用 Record 类型来定义一个 userById 变量,它是一个键值对类型,键是 number 类型,值是 User 类型。我们使用 reduce 方法将 user 数组转换成一个对象,该对象以每个 User 对象的 id 作为键,以该 User 对象本身作为值。
Record 和 Interface 使用上的区别
TS Record 是一种新型的 TypeScript 类型,用于表示具有相同类型的实例对象。它以大括号包裹的键值对属性列表的方式来定义。例如,一个表示人员信息的 TS Record 类型可以定义为:
type Person = { name: string; age: number; gender: 'male' | 'female'; }
而 Interface 更加通用,可以表示任何类型,包括对象、函数、类等等。它通过关键字 interface 来定义,以冒号分割类型和值得方式来定义。例如,一个表示人员信息的 Interface 类型可以定义为:
interface Person { name: string; age: number; gender: 'male' | 'female'; }
另外,使用 TS Record 可以轻松地定义一组属性相同但值不同的对象。而 Interface 可以包含方法和可选属性等,可以定义更为复杂的类型。
在使用上,TS Record 更适合用于定义一些简单的数据类型,例如配置项、传输对象等,而 Interface 更适合用于定义更复杂的类型,例如类的接口、函数接口等等。同时,在 TS 中也可以同时使用两种语法来定义类型,根据场景和需求选择合适的方式即可。