使用JSDoc typedef后,如何结合扩展运算符与map()规避IDE类型警告?
问题
我尝试用JSDoc的@typedef定义对象类型:
/** * @typedef AccommodationData * @type {Object} * @property {string} id * @property {string} name * @property {boolean} selected */
接着把accommodations声明为AccommodationData[]类型数组,并用map()结合扩展运算符迭代更新属性:
import { LightningElement } from 'lwc'; export default class AccommodationList extends LightningElement { // --- 私有属性 --- /** @type {AccommodationData[]} */ accommodations = []; // --- 访问器 --- /** * 获取已应用选中状态的住宿数据。 * @returns {AccommodationData[]} */ get accommodationsData() { return this.accommodations.map((a) => ({ ...a, selected: this.selectedId === a.id })); } }
此时IDE抛出警告:
返回表达式类型(any & {selected: boolean})[]无法分配给类型AccommodationData[]
类型any & {selected: boolean}无法分配给类型AccommodationData
类型number无法分配给类型undefined
需要在保留该typedef与现有写法的前提下消除警告。
解决方案
以下几种方式都能保留你的typedef定义和原有写法,同时消除类型警告:
1. 给map迭代参数添加类型注解
在map回调的参数a上明确标注类型,让IDE识别出它是AccommodationData类型,避免被推断为any:
get accommodationsData() { return this.accommodations.map((/** @type {AccommodationData} */ a) => ({ ...a, selected: this.selectedId === a.id })); }
2. 给返回对象添加类型断言
直接给扩展后的对象标注AccommodationData类型,明确告知IDE这就是目标类型:
get accommodationsData() { return this.accommodations.map((a) => /** @type {AccommodationData} */ ({ ...a, selected: this.selectedId === a.id }) ); }
3. 修正selectedId的类型匹配
警告中提到“类型number无法分配给类型undefined”,说明selectedId可能被推断为number类型,但AccommodationData的id是string类型。给selectedId加上类型注解,确保类型一致:
/** @type {string} */ selectedId = ''; // 可根据业务设置合适的初始值
内容的提问来源于stack exchange,提问作者Steve Schrab
相关产品推荐
相关产品推荐

