代码之家  ›  专栏  ›  技术社区  ›  Miles P

Typescript类型检查不适用于我的装饰程序

  •  2
  • Miles P  · 技术社区  · 7 年前

    在我的示例中考虑以下方法 Map 类别:

    @XYLiteralDecorator
    setCenter(xy: XY | XYLiteral): void {
        this.mapI.centerAt((<XY>xy).projectToPoint(3978));
    }
    

    这是 @XYLiteralDecorator 上面使用的装饰器:

    function XYLiteralDecorator(target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any>) {
        const originalMethod = descriptor.value;
        descriptor.value = function(maybeXY: XY | XYLiteral): XY {
            return originalMethod.apply(this, [isXYLiteral(maybeXY) ? new XY(maybeXY[0], maybeXY[1]) : maybeXY]);
        };
        return descriptor;
    }
    

    你会注意到 setCenter 我需要强制的方法 xy 属于类型 XY 因为TS会投诉 xy 可以是 XY XYLiteral 否则然而,我的装饰师将始终确保 xy 属于类型 XY .

    TS可能知道吗 xy 只能是类型 同时允许两者 XY 木素 要作为参数传递的类型(没有像我上面所做的那样强制类型)?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Titian Cernicova-Dragomir    7 年前

    您可以添加包含union类型参数的重载,并使实现具有实际的参数类型:

    setCenter(xy: XY | XYLiteral): void;
    @XYLiteralDecorator
    setCenter(xy: XY ): void {
        console.log(xy.getX());
    }
    

    这正如预期的那样,您可以使用任何一种类型进行调用,实现将知道实际的类型:

    dds.setCenter(new XY(0,0));
    dds.setCenter([1, 1]);
    

    完整样本 here