ArkTS-Record详解

642 阅读2分钟

ArkTS-Record详解

Record 基本认识

  • 泛型Record<K, V>用于将类型(键类型)的属性映射到另一个类型(值类型)。常用对象字面量来初始化该类型的值:
let map: Record<string, number> = {
  'John': 25,
  'Mary': 21,
}

map['John']; // 25
  • 类型K可以是字符串类型或数值类型,而V可以是任何类型。
interface PersonInfo {
  age: number
  salary: number
}
let map: Record<string, PersonInfo> = {
  'John': { age: 25, salary: 10},
  'Mary': { age: 21, salary: 20}
}

Record 的特点

灵活的键类型和值类型

  • 键可以是任何类型,如字符串、数字、符号等。
  • 值也可以是任何类型,包括原始类型、对象类型、函数类型等。

可以用于类型约束

  • 在函数参数或变量声明中,可以使用Record来约束对象的结构。

可扩展性

  • 可以通过扩展Record类型来添加更多的键值对。

Record 的案例

  • 创建一个表示用户信息的对象类型
type UserInfo = Record<string, string | number>;

const user: UserInfo = {
    'name': 'Alice',
    'age': 30,
    'email': 'alice@example.com',
};
  • 定义一个函数,接受一个特定结构的 Record 类型参数
type OptionRecord = Record<'option1' | 'option2' | 'option3', boolean>;

function processOptions(options: OptionRecord) {
  if (options.option1) {
    console.log('Option 1 is enabled.');
  }
  if (options.option2) {
    console.log('Option 2 is enabled.');
  }
  if (options.option3) {
    console.log('Option 3 is enabled.');
  }
}

const myOptions: OptionRecord = {
  'option1': true,
  'option2': false,
  'option3': true,
};

processOptions(myOptions);

在这个案例中,函数processOptions接受一个特定结构的Record类型参数,其中键只能是'option1'、'option2'和'option3',值为布尔类型。

  • 扩展 Record 类型
type BaseRecord = Record<'key1' | 'key2', string>;

type ExtendedRecord = BaseRecord | Record<'key3', number>;

const extendedObj: ExtendedRecord = {
  'key1': 'value1',
  'key2': 'value2',
  'key3': 123,
};
  • Record 与联合类型结合
type ActionType = 'login' | 'logout' | 'create' | 'update';
type ActionValue = string | number | boolean;

type UserActions = Record<ActionType, ActionValue>;

const actions: UserActions = {
  'login': '2024-10-16 08:00',
  'logout': false,
  'create': 1234,
  'update': 'new data',
};
  • Record 与函数类型结合
type EventHandler = () => void;
type EventMap = Record<'click' | 'hover' | 'submit', EventHandler>;

const eventHandlers: EventMap = {
    'click': () => console.log('Clicked!'),
    'hover': () => console.log('Hovered!'),
    'submit': () => console.log('Submitted!'),
};

在这个案例中,首先定义了一个基础的Record类型BaseRecord,然后通过与另一个Record类型合并,扩展了它的结构。 总的来说,Record在 ArkTS 中是一个非常有用的工具,可以帮助你更灵活地定义和约束对象类型。