关于单元测试:允许在TypeScript中使用未定义的函数调用来测试JavaScript环境

Allow undefined function calls in TypeScript to test for JavaScript environments

我正在构建一个小型的TypeScript框架,我也想确保它与JavaScript的兼容性。我有这样的类接口:

1
2
3
class Foo {
    constructor(name : string, id : number);
}

由于这个函数也可以从普通JavaScript调用,我也有一些健全性检查,以确保参数实际上具有正确的类型。

到现在为止还挺好。对于这个函数,我也有用TypeScript编写的单元测试。我现在想要的是一个单元测试,它检查当提供错误的参数类型时此函数是否抛出异常。例如:

1
2
3
new Foo(3) // throws an exception
// Undefined overload in TS
// But should be testable in TS for JS-compatibility

现在的问题是,在编译这样的单元测试时,它会抛出一个错误,正确地说明我试图调用的函数不存在。意思是我无法编译我的TypeScript单元测试。

到目前为止,我最好的解决方法是将这些类型的单元测试定义为JavaScript测试,而不是TypeScript测试。但我宁愿将这些测试与Foo类的所有其他测试组合在一起,而不是按类型和JavaScript将它们分开。

所以,我正在寻找一种方法告诉编译器在我的单元测试范围内可以调用这个未定义的函数,所以我可以测试它。或者可以定义测试范围的签名。有人知道这是否可能?

谢谢!

佩德罗


它看起来有点讨厌,但您可以告诉编译器将Foo视为any

1
var a = new (Foo)(3);

类型断言是重要的一点。


您可以使用强制语法覆盖Typescript对变量类型的思考:

1
var a = new Foo(<string> 42, <number>"not a number")

在这种情况下,如果更改构造函数签名,即使不运行测试,也会出现编译时错误。