在 TypeScript 中强制执行对象值的类型
使用 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 };
在示例中,我们将对象键入为仅具有字符串或数字类型的键
name
、type
和age
。
如果我们尝试在对象上设置具有不同名称的键,类型检查器将抛出错误。
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 };
下面是一个将对象的键限制为特定字符串的并集并将其值设置为包含 role 和 salary 属性的对象的示例。
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
类型的值。
这使我们能够具体说明我们知道的键的名称,但仍然允许使用其他键,只要它们具有正确类型的值即可。
相关文章
Python 使用 JSON Diff 比较多级 JSON 对象
发布时间:2023/04/25 浏览次数:78 分类:Python
-
本文旨在介绍我们如何在Python中比较两个多级 JSON 对象并确定它们是否相同。
在 AngularJs 中设置 Select From Typescript 的默认选项值
发布时间:2023/04/14 浏览次数:78 分类:Angular
-
本教程提供了在 AngularJs 中从 TypeScript 中设置 HTML 标记选择的默认选项的解释性解决方案。
在 Angular 中使用 TypeScript 的 getElementById 替换
发布时间:2023/04/14 浏览次数:153 分类:Angular
-
本教程指南提供了有关使用 TypeScript 在 Angular 中替换 document.getElementById 的简要说明。这也提供了在 Angular 中 getElementById 的最佳方法。
在 Vue 中给对象动态添加属性和值
发布时间:2023/03/24 浏览次数:229 分类:Vue
-
在Vue中,我们经常需要操作对象的属性和值。有时候我们需要动态添加属性和值,以满足业务需求。本文将详细介绍如何在Vue中给对象动态添加属性和值,并且提供一些注意事项。 使用