如何在 TypeScript 对象中强制执行索引成员的类型
TypeScript 编程语言基于 JavaScript,并且是强类型、面向对象和编译型的。该语言通过静态类型、类和接口等工具得到了改进,有助于早期错误检测并使 JavaScript 更易于管理。TypeScript 的一项功能是能够强制执行对象索引成员的类型,此过程也称为索引签名。
索引签名是一组键值对,描述了对象可能具有的许多属性。分别使用值和键指定属性名称的类型和属性值的类型。要强制执行对象属性的类型,用户可以使用 TypeScript 的索引签名功能。
索引签名可以有效地强制执行某些对象属性,但它们也可能使代码难以理解和维护。因此,只有在必要时才使用索引签名非常重要。
语法
let objectName: { [key: string]: string }
在上述语法中,“objectName”是我们的对象名称,我们强制执行键类型为字符串,值也为字符串。
示例 1
在此示例中,我们有两个接口,Person 和 PhoneBook。Person 接口定义了具有两个属性的人员对象的结构:name(字符串)和 age(数字)。PhoneBook 接口定义了一个索引签名,该签名使用字符串类型作为键,使用 Person 接口作为值。这意味着任何实现 PhoneBook 接口的对象只能具有键类型为字符串且值类型为 Person 的属性。
然后,我们定义一个变量 phoneBook 类型为 PhoneBook 并分配一个空对象。然后,我们向电话簿中添加一些条目,这些条目应以名称作为键,以 Person 对象作为值。最后,我们控制台输出这些值以验证我们是否尝试放置任何其他类型的变量而不是提到的类型,然后编译器将给出错误。
// Person interface interface Person { name: string age: number } // PhoneBook interface interface PhoneBook { [key: string]: Person } let phoneBook: PhoneBook = {} phoneBook['Person 1'] = { name: 'ABC', age: 30 } phoneBook['Person 2'] = { name: 'XYZ', age: 25 } phoneBook['Person 3'] = { name: 'MNO', age: 10 } console.log(phoneBook)
编译后,它将生成以下 JavaScript 代码:
var phoneBook = {}; phoneBook['Person 1'] = { name: 'ABC', age: 30 }; phoneBook['Person 2'] = { name: 'XYZ', age: 25 }; phoneBook['Person 3'] = { name: 'MNO', age: 10 }; console.log(phoneBook);
输出
以上代码将产生以下输出:
{ 'Person 1': { name: 'ABC', age: 30 }, 'Person 2': { name: 'XYZ', age: 25 }, 'Person 3': { name: 'MNO', age: 10 } }
示例 2
在此示例中,我们有一个 Product 接口,它定义了具有两个属性的产品对象的结构:name(字符串)和 price(数字)。然后,我们还有另一个 ShoppingCart 接口,它表示一个索引签名,该签名使用数字类型作为键,使用 Product 接口作为值。任何实现 ShoppingCart 接口的对象只能具有键类型为数字且值类型为 Product 的属性。
然后,我们定义一个名为 cart 的变量,其类型为 ShoppingCart,并向其分配一个空对象。然后,我们向购物车中添加一些条目,这些条目应以产品 ID 作为键,以产品对象作为值。我们可以看到条目已正确添加到购物车中,如果值不是 Product 类型或产品对象缺少 Product 接口中定义的任何属性,则会出错。
interface Product { name: string price: number } // ShoppingCart interface interface ShoppingCart { [key: number]: Product } let cart: ShoppingCart = {} cart[1] = { name: 'Shirt', price: 20 } cart[2] = { name: 'Pants', price: 30 } cart[3] = { name: 'Shoes', price: 40 } console.log(cart[1]) console.log(cart[2]) console.log(cart[3])
编译后,它将生成以下 JavaScript 代码:
var cart = {}; cart[1] = { name: 'Shirt', price: 20 }; cart[2] = { name: 'Pants', price: 30 }; cart[3] = { name: 'Shoes', price: 40 }; console.log(cart[1]); console.log(cart[2]); console.log(cart[3]);
输出
以上代码将产生以下输出:
{ name: 'Shirt', price: 20 } { name: 'Pants', price: 30 } { name: 'Shoes', price: 40 }
这些示例说明了如何使用索引签名来强制执行对象的属性类型。索引签名是一个强大的功能,可以帮助您编写更健壮且更易于维护的代码,但重要的是明智地使用它们,并且仅在必要时使用。