覆盖/扩展打字稿类表达式

时间:2018-11-14 14:49:01

标签: typescript class inner-classes extend overwrite

我的公司为该软件开发了一个自己的测试框架,因为在我们开发的软件的上下文中不可能使用开源框架。

无论如何,我编写了Typescript定义文件来改善VS Code的代码完成度,但是我不能使其在以下设置中起作用:

以下类用于定义单元测试。它提供了一些功能,例如断言。主要问题是util-namespace。您可以传递一个实际上是单元测试的功能。请注意,该函数的this对象指向单元测试类,以便传递的函数可以使用单元测试的函数(内部将通过“ unitTest.call(this)”调用传递的函数来设置该功能对象到单元测试实例)

class UnitTest {
    constructor(unitTest: (this: UnitTest) => void);
    .
    .
    .
    util = Util; // Referes to the Util-Class (it's a class because its the only possibility in typescript for nesting 

Util类提供了一些常规功能,这些功能对于编写测试非常有用

class Util {
    static createFile(filePath: string): File;
    .
    .
    .
}

如果您这样声明一个单元测试,则一切正常:

var unitTest = new UnitTest(function() {
     this.util.createFile("..."); // VS-Code provides code completion for that functions of the unit-test-namespace
});

问题是,util-class(用于 代码封装)可以在每个项目中扩展。您可以按照特定的名称架构定义脚本,然后testframework会动态加载该脚本并在util名称空间中提供该功能,例如“ test.util.myProject.js”

module.exports = {
    myCustomUtilFunction = function () { ... }
};

只需提供脚本,您就可以在单元测试中使用该功能:

var unitTest = new UnitTest(function() {
 this.util.myCustomUtilFunction();
});

但是我不能用打字稿定义文件来介绍。 VS-Code不会为自定义util函数提供任何代码完成功能,因为测试框架的打字稿定义中缺少该功能。我试图按如下方式扩展Util类,但VS-Code不在乎:

class Util {
    static myCustomUtilFunction(): void;
}

有什么办法解决这个问题吗?


为便于理解,这里是完整的设置
testframework.d.ts

class UnitTest {
    constructor(unitTest: (this: UnitTest) => 

    util = Util;
}

class Util {
    static createFile(filePath: string): File;
}

myExtendedUtilNamespace.d.ts

class Util {
    static myCustomUtilFunction(): void;
}

unitTests.js

var unitTest = new UnitTest(function() {
    this.util.createFile("..."); // works
    this.util.myCustomUtilFunction(); // does not work
});

1 个答案:

答案 0 :(得分:0)

在我看来,Util类从未实例化。如果那是正确的,那不应该是一门课。 namespace在这种情况下更合适。命名空间也可以在声明文件之间合并。

// testframework.d.ts
class UnitTest {
    constructor(unitTest: (this: UnitTest) => void);

    util = Util;
}

declare namespace Util {
    export function createFile(filePath: string): File;
}

// myExtendedUtilNamespace.d.ts
declare namespace Util {
  export function myCustomUtilFunction(): void;
}

有关名称空间的信息,请参见《 TypeScript手册》: https://www.typescriptlang.org/docs/handbook/namespaces.html