我在JS项目中使用Typescript和JSDOC,并且正在针对TS编译器验证代码。
以下代码引发TS验证错误:
interface IBox {
idx: number;
}
interface IBoxes {
get(idx?: number): IBox | IBox[];
}
class Box implements IBox {
constructor() {
this.idx = 0;
}
}
class Boxes {
constructor() {
this.boxes = [new Box(0)];
}
/**
* @param {number} idx
*/
get(idx) {
if (idx) {
return this.boxes.find(b => b.idx === idx);
}
return this.boxes;
}
/**
* @param {IBox} value
*/
set(value) {
this.boxes.push(value);
}
}
const boxes = new Boxes();
/** @type {IBox} */
const box = boxes.get(0);
box.idx; // Property "idx" does not exist on type "IBox" | "IBox[]"
// Property 'idx' does not exist on type 'IBox[]
(box as IBox).idx; // Suppressing the error
我知道可以键入cast来处理这种情况。但是,由于这是一个JS项目,由于缺少as
关键字,我该如何仅使用普通的旧JS来完成此操作?是否可以使用某些JSDOC属性或其他方法使其工作?
答案 0 :(得分:0)
在运行时,如何保证box
是IBox
而不是IBox[]
或undefined
?说服编译器可以安全地获取idx
属性,它将使您:
if (box) {
if ('idx' in box) {
box.idx; // okay, box is now recognized as IBox
} else {
box[0].idx; // okay, box is recognized as IBox[]
}
} else {
// no box
}
希望如此。祝你好运。