覆盖/扩展 typescript class 表达式
Overwrite / extend typescript class expressions
我的公司已经为该软件开发了自己的测试框架,因为在我们开发的软件环境中不可能使用开源框架。
无论如何,我编写了 Typescript 定义文件来改进 VS Code 的代码完成,但我无法使其适用于以下设置:
下面的class用于定义单元测试。它提供了一些功能,例如用于断言。主要问题是实用程序命名空间。您可以传递一个实际上是单元测试的函数。请注意,该函数的 this-object 指向单元测试 class 以便传递的函数可以使用单元测试的函数(内部传递的函数将使用 "unitTest.call(this)" 调用以设置函数的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提供了一些对编写测试很有用的通用函数
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(用于
代码封装)可以在每个项目中扩展。您可以定义一个遵循特定名称模式的脚本,测试框架动态加载该脚本并在 util 命名空间中提供该功能,例如"test.util.myProject.js"
module.exports = {
myCustomUtilFunction = function () { ... }
};
只需提供脚本,您就可以在单元测试中使用该函数:
var unitTest = new UnitTest(function() {
this.util.myCustomUtilFunction();
});
但我不能用打字稿定义文件来解决这个问题。 VS-Code 不会为自定义 util 函数提供任何代码完成,因为它在测试框架的打字稿定义中缺失。我尝试如下扩展 Util-class,但 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
});
对我来说,听起来 Util
class 从未实例化过。如果那是正确的,它不应该是 class。 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
我的公司已经为该软件开发了自己的测试框架,因为在我们开发的软件环境中不可能使用开源框架。
无论如何,我编写了 Typescript 定义文件来改进 VS Code 的代码完成,但我无法使其适用于以下设置:
下面的class用于定义单元测试。它提供了一些功能,例如用于断言。主要问题是实用程序命名空间。您可以传递一个实际上是单元测试的函数。请注意,该函数的 this-object 指向单元测试 class 以便传递的函数可以使用单元测试的函数(内部传递的函数将使用 "unitTest.call(this)" 调用以设置函数的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提供了一些对编写测试很有用的通用函数
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(用于 代码封装)可以在每个项目中扩展。您可以定义一个遵循特定名称模式的脚本,测试框架动态加载该脚本并在 util 命名空间中提供该功能,例如"test.util.myProject.js"
module.exports = {
myCustomUtilFunction = function () { ... }
};
只需提供脚本,您就可以在单元测试中使用该函数:
var unitTest = new UnitTest(function() {
this.util.myCustomUtilFunction();
});
但我不能用打字稿定义文件来解决这个问题。 VS-Code 不会为自定义 util 函数提供任何代码完成,因为它在测试框架的打字稿定义中缺失。我尝试如下扩展 Util-class,但 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
});
对我来说,听起来 Util
class 从未实例化过。如果那是正确的,它不应该是 class。 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