迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > TypeScript >

在 TypeScript 中强制执行对象值的类型

作者:迹忆客 最近更新:2022/12/28 浏览次数:

使用 Record 实用程序类型强制执行 TypeScript 中对象值的类型,例如 type Animal = Record<string, string>。 Record 实用程序类型构造一个对象类型,其键和值具有特定类型。

// 👇️ function returning an object
// whose keys and values are of type string
function getObj(): Record<string, string> {
  return { name: 'Tom', country: 'Chile' };
}

type Animal = Record<string, string>;

const a1: Animal = { name: 'Alfred', type: 'dog' };

Record 实用程序类型可用于将一种类型的属性映射到另一种类型。

我们传递给泛型的第一个类型是键的类型,第二个是值的类型。

type Animal = Record<string, number>;

const a1: Animal = { age: 3, num: 6 };

如果我们提前知道键的名称,则可以使用 union 来限制它们。

type Animal = Record<'name' | 'type' | 'age', string | number>;

const a1: Animal = { name: 'Alfred', type: 'dog', age: 3 };

在示例中,我们将对象键入为仅具有字符串或数字类型的键 nametypeage

如果我们尝试在对象上设置具有不同名称的键,类型检查器将抛出错误。

type Animal = Record<'name' | 'type' | 'age', string | number>;

// ⛔️ Error: Type '{ country: string; type: string; age: number; }'
// is not assignable to type 'Animal'.
const a1: Animal = { country: 'UK', type: 'dog', age: 3 };

TypeScript 中强制执行对象值的类型错误

下面是一个将对象的键限制为特定字符串的并集并将其值设置为包含 rolesalary 属性的对象的示例。

interface EmployeeData {
  role: string;
  salary: number;
}

type EmployeeName = 'tom' | 'alice' | 'jeff';

const employees: Record<EmployeeName, EmployeeData> = {
  tom: { role: 'accountant', salary: 10 },
  alice: { role: 'manager', salary: 15 },
  jeff: { role: 'programmer', salary: 17 },
};

尝试添加对象上不存在的键会导致类型检查器抛出错误。

interface EmployeeData {
  role: string;
  salary: number;
}

type EmployeeName = 'tom' | 'alice' | 'jeff';

const employees: Record<EmployeeName, EmployeeData> = {
  tom: { role: 'accountant', salary: 10 },
  alice: { role: 'manager', salary: 15 },
  jeff: { role: 'programmer', salary: 17 },
  // ⛔️ Error: Object literal may only specify known
  // properties, and 'ben' does not exist in type
  // 'Record<EmployeeName, EmployeeData>'.
  ben: { role: 'programmer', salary: 17 },
};

Record 实用程序类型允许我们在键入对象的键和值时尽可能宽泛或狭窄。

如果我们知道某些对象键的名称,但希望能够包含具有其他名称的键(只要它们具有正确类型的值),请使用 union 类型。

interface EmployeeData {
  role: string;
  salary: number;
}

type EmployeeName = 'tom' | 'alice' | 'jeff';

//                        👇️ use Union here
const employees: Record<string | EmployeeName, EmployeeData> = {
  tom: { role: 'accountant', salary: 10 },
  alice: { role: 'manager', salary: 15 },
  jeff: { role: 'programmer', salary: 17 },
  ben: { role: 'programmer', salary: 17 },
};

即使 ben 不在 EmployeeName 类型中,我们也可以将属性添加到对象,因为它有一个 EmployeeData 类型的值。

这使我们能够具体说明我们知道的键的名称,但仍然允许使用其他键,只要它们具有正确类型的值即可。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

PHP 中的对象运算符

发布时间:2023/03/29 浏览次数:121 分类:PHP

本教程演示如何在 PHP 中使用对象运算符(->)。

在 Vue 中给对象动态添加属性和值

发布时间:2023/03/24 浏览次数:229 分类:Vue

在Vue中,我们经常需要操作对象的属性和值。有时候我们需要动态添加属性和值,以满足业务需求。本文将详细介绍如何在Vue中给对象动态添加属性和值,并且提供一些注意事项。 使用

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便