如何在TypeScript中使用Record类型?


在TypeScript中,Record类型是一个强大的工具,允许您定义具有特定键和相应值类型的对象类型。本教程将指导您学习使用Record类型的基础知识,并沿途提供语法解释和实际示例。无论您是初学者还是已经熟悉TypeScript,本教程都将帮助您了解如何在项目中有效地利用Record类型。

语法

在TypeScript中创建Record类型的语法很简单。类型定义以关键字Record开头,后跟尖括号(<>),其中包含用花括号({})括起来的键和值类型。以下是一个说明语法的示例:

type MyRecord = Record<string, number>;

在这里,我们将MyRecord定义为一个Record类型,具有字符串键和数字值。现在,让我们深入研究Record类型有用的不同场景。

示例1:定义字典

Record类型的常见用例是创建具有特定键值对的字典。当您需要组织数据或按其各自的键访问值时,这尤其有用。在此代码片段中,我们将AnimalAges定义为一个Record类型,具有字符串键和数字值。ages对象代表我们的字典,动物名称作为键,它们各自的年龄作为值。我们可以使用点表示法访问值,如console.log语句所示。

type AnimalAges = Record<string, number>;
const ages: AnimalAges = {
   dog: 5,
   cat: 3,
   rabbit: 2,
};
console.log(ages.dog);
console.log(ages.cat);

编译后,它将生成以下JavaScript代码:

var ages = {
   dog: 5,
   cat: 3,
   rabbit: 2
};
console.log(ages.dog);
console.log(ages.cat);

输出

以上代码将产生以下输出:

5
3

示例2:保留键类型

Record类型很灵活,允许您保留特定的键类型,例如字面量类型。当在对象中强制执行严格的键名时,这很有用。在此示例中,我们将FruitColors定义为表示不同水果名称的联合类型。然后,我们使用Record类型创建ColorsRecord,水果名称作为键,字符串值代表它们各自的颜色。通过使用字面量类型,我们确保只有有效的水果名称可以用作colors对象中的键。

type FruitColors = 'apple' | 'banana' | 'orange'; type ColorsRecord = Record<FruitColors, string>;
const colors: ColorsRecord = {
   apple: 'red',
   banana: 'yellow',
   orange: 'orange',
};

console.log(colors.apple); 
console.log(colors.banana);

编译后,它将生成以下JavaScript代码:

var colors = {
   apple: 'red',
   banana: 'yellow',
   orange: 'orange'
};
console.log(colors.apple);
console.log(colors.banana);

输出

以上代码将产生以下输出:

red
yellow

示例3:映射和转换值

Record类型也可用于映射和转换对象中的值。让我们考虑一个场景,我们有一列学生姓名,并希望使用Record类型将其转换为大写。在此示例中,我们将StudentNames定义为具有特定键的对象类型,这些键表示学生姓名。然后,我们使用Record类型创建UppercaseNames,确保键与StudentNames中的键相同。通过使用toUpperCase()方法,我们将名称转换为大写并将它们分配给uppercaseStudents对象中相应的键。

type StudentNames = {
   alice: string;
   bob: string;
   charlie: string;
};

type UppercaseNames = Record<keyof StudentNames, string>;

const students: StudentNames = {
   alice: 'Alice',
   bob: 'Bob',
   charlie: 'Charlie',
};

const uppercaseStudents: UppercaseNames = {
   alice: students.alice.toUpperCase(),
   bob: students.bob.toUpperCase(),
   charlie: students.charlie.toUpperCase(),
};

console.log(uppercaseStudents);

编译后,它将生成以下JavaScript代码:

var students = {
   alice: 'Alice',
   bob: 'Bob',
   charlie: 'Charlie'
};
var uppercaseStudents = {
   alice: students.alice.toUpperCase(),
   bob: students.bob.toUpperCase(),
   charlie: students.charlie.toUpperCase()
};
console.log(uppercaseStudents);

输出

以上代码将产生以下输出:

{ alice: 'ALICE', bob: 'BOB', charlie: 'CHARLIE' }

示例4:处理动态对象键

当处理具有动态键的对象时,Record类型尤其有用。考虑一个场景,我们想计算句子中单词的出现次数。在此示例中,我们定义countWords函数,该函数接受句子作为输入并返回Record类型,其中键代表句子中唯一的单词,值代表每个单词出现的频率。通过将句子拆分为单词数组并遍历每个单词,我们可以相应地更新wordCount对象中的计数。

function countWords(sentence: string): Record<string, number> {
   const words: string[] = sentence.split(' ');
   const wordCount: Record<string, number> = {};

   words.forEach((word) =< {
      if (wordCount[word]) {
         wordCount[word]++;
      } else {
         wordCount[word] = 1;
      }
   });

   return wordCount;
}

const sentence = 'This is a sentence. This sentence contains multiple words.';
const wordCount = countWords(sentence);

console.log(wordCount);

编译后,它将生成以下JavaScript代码:

function countWords(sentence) {
   var words = sentence.split(' ');
   var wordCount = {};
   words.forEach(function (word) {
      if (wordCount[word]) {
         wordCount[word]++;
      }
      else {
         wordCount[word] = 1;
      }
   });
   return wordCount;
}
var sentence = 'This is a sentence. This sentence contains multiple words.';
var wordCount = countWords(sentence);
console.log(wordCount);

输出

以上代码将产生以下输出:

{
   This: 2,
   is: 1,
   a: 1,
   'sentence.': 1,
   sentence: 1,
   contains: 1,
   multiple: 1,
   'words.': 1
}

结论

TypeScript中的Record类型提供了一种方便的方法来定义具有特定键值对的对象。无论您是创建字典还是保留键类型,Record类型都提供灵活性和类型安全。通过理解语法并探索各种场景,您可以利用Record类型的强大功能来编写更具表现力和更无错误的代码。

更新于:2023年8月21日

379 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告