
本教程探讨在 jsdoc 中定义具有固定必选属性和任意可选额外属性的对象类型。我们将介绍两种主要策略:使用通配符属性实现高度灵活性,以及结合交叉类型与字典类型实现更强的类型约束,以确保类型定义的准确性和避免因额外属性导致的类型检查错误。
在 JavaScript 项目中,JSDoc 是一种强大的工具,用于为代码添加类型注解,从而提升开发效率和代码可维护性。然而,在某些场景下,我们需要定义一种对象类型,它既包含一组固定的、明确定义的属性,又允许开发者自由添加任意数量的额外属性。例如,一个 User 对象可能需要强制包含 name 和 age 属性,同时又允许添加 from、to 等动态属性。本文将详细介绍如何在 JSDoc 中实现这种灵活的对象类型定义。
假设我们有一个 User 类型,要求:
以下是一个初始的 JSDoc 定义,它会在添加额外属性时引发类型错误:
/**
* @typedef {object} User
* @property {string} name - 用户名
* @property {number} age - 用户年龄
*/
/**
* @type {User}
*/
const tom = {
name: 'cx',
age: 25,
from: 'sh', // 预期会报错
to: 'bj', // 预期会报错
};为了解决这个问题,我们可以采用以下两种 JSDoc 定义策略。
最直接且最灵活的方法是使用 JSDoc 的通配符属性 (*) 来指示对象可以拥有除明确定义属性之外的任何其他属性。这种方法不对额外属性的键或值进行类型限制。
/**
* @typedef {Object} User
* @property {string} name - 用户名 (必填)
* @property {number} age - 用户年龄 (必填)
* @property {*} [key: value] - 允许用户添加的任意额外属性 (可选)
*/
/**
* @type {User}
*/
const tom = {
name: 'cx',
age: 25,
from: 'sh', // 不再报错
to: 'bj', // 不再报错
isActive: true, // 同样不会报错
};说明:
优点:
缺点:
当我们需要对额外属性的类型进行更具体的约束时(例如,所有额外属性的值都必须是字符串),可以使用 JSDoc 的交叉类型 (&) 结合字典类型 Object.<string, Type>。这种方法允许我们定义一个具有特定类型签名的额外属性集合,并将其与固定属性合并。
/**
* @typedef {object} UserBase
* @property {string} name - 用户名
* @property {number} age - 用户年龄
*/
/**
* @typedef {Object.<string, string>} AdditionalProperties - 额外属性,键为字符串,值为字符串
*/
/**
* @typedef {UserBase & AdditionalProperties} User - 包含固定属性和额外字符串属性的用户类型
*/
/**
* @type {User}
*/
const tom = {
name: "cx",
age: 25,
from: "sh", // 不再报错
to: "bj", // 不再报错
// isActive: true, // 如果这里尝试添加非字符串值,将引发类型错误
};
/**
* 尝试添加一个不符合类型约束的属性
* @type {User}
*/
const invalidTom = {
name: "john",
age: 30,
country: "USA",
// isVerified: true, // 错误:'true' 不是 string 类型
};说明:
优点:
缺点:
在 JSDoc 中定义同时包含固定属性和可变额外属性的对象类型时,选择哪种方法取决于你对类型安全性和灵活性的具体需求:
通过合理运用这些 JSDoc 策略,你可以为复杂的 JavaScript 对象提供清晰、准确的类型定义,从而提升项目的整体质量和开发体验。
以上就是JSDoc 中定义包含固定属性和可变额外属性的对象类型的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号