Typecast JS变量到Typescript接口

时间:2018-06-19 13:45:10

标签: typescript casting jsdoc

我在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属性或其他方法使其工作?

1 个答案:

答案 0 :(得分:0)

在运行时,如何保证boxIBox而不是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
}  

希望如此。祝你好运。