TypeScript装饰器无法识别新属性

时间:2018-01-08 14:02:16

标签: javascript typescript

让我们说我有一个类装饰器,可以为类添加一些方法。

function decorator(target) {
  target.prototype.method = function() {};
}


@decorator
class Test {
  constructor() {
    this.method()  <------- Property method does not exists on type Test
  }
}

如果我有能力添加装饰器但是打字稿不能识别它们,它就没什么价值。

有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

装饰器用于各种原因,从修改类到面向方面的编程,再到简单的日志记录。几乎任何事情都可能发生在装饰者身上。此时,装饰器的内容不用于修改类的类型信息(在某些情况下,可能无法这样做,尽管在您的情况下,它可能是如此直接的一个)。

如果要向类添加方法,可以考虑TypeScript mixins作为替代或简单继承(见下文)。

占位符实现

针对您的问题的一个简单修复方法是提供一个空方法来生成所需的类型信息:

## cml

cmake_minimum_required (VERSION 2.8.11)
project (Parser)
include_directories("src")
set (CMAKE_CXX_STANDARD 11)

find_package(MPI REQUIRED)
include_directories(${MPI_INCLUDE_PATH})
add_executable (parserX "src/pparse.cpp" "src/pparse.hpp")
target_link_libraries(parserX ${MPI_LIBRARIES})


if(MPI_COMPILE_FLAGS)
  set_target_properties(parserX PROPERTIES
    COMPILE_FLAGS "${MPI_COMPILE_FLAGS}")
endif()

if(MPI_LINK_FLAGS)
  set_target_properties(proteome PROPERTIES
    LINK_FLAGS "${MPI_LINK_FLAGS}")
endif()

替换构造函数

另一种解决方案是替换装饰器中的构造函数 - 所以你在装饰器中添加方法和构造函数调用 - 从而确保实现将在那里。

@decorator
class Test {
  constructor() {
      this.method();
    }

    method(): void { }
}

继承

这是无聊的,但通常是正确的解决方案(如果你不想继承,你可以委托代替):

function decorator(target: any) {
    const original = target;

    const constr: any = (...args) => {
        const c: any = () => {
            return original.apply(null, args);
        }

        c.prototype = original.prototype;
        c.prototype.method = function () { alert('method');};

        const inst = new c();
        inst.method();
        return inst;
    }

    constr.prototype = original.prototype;

    return constr;

}

@decorator
class Test {
    constructor() {
    }
}

const test = new Test();