当试图将一个简单的JS文件转换为TS而隐式"any"被禁用时,我收到此错误:
错误TS7009:'new'表达式,缺少构造函数签名,隐式具有"any"类型.
interface Logger { new ():any; //():any; // "Callable" syntax. same error. //new ():LoggerInstance; //Same error. } interface LoggerInstance { } function Logger(): void { } var defaultLogger: LoggerInstance = new Logger();//error TS7009 //var defaultLogger: LoggerInstance =new Logger();//same error //var defaultLogger: LoggerInstance = new Logger();//same error
我没有看到如何在不将Logger函数转换为类的情况下执行此操作.
在没有隐式任何禁用的情况下,typescript编译器提出了任何改进建议,所以我想保留该设置.
更新:如果我从Logger接口中删除"new"然后转换新Logger(...)的结果,让它在完整文件中编译,但在我较小的测试示例中,我继续得到相同的错误.
更新2好的,我认为当红色下划线语法错误的插件崩溃时,错误警告就会消失.我认为当禁用"隐式任意"时,必须禁止这种对象创建方式.
简短的错误答案
interface IPerson {
name: string;
}
var person = function(name: string) : void {
this.name = name;
}
let funcPerson = (new ((person("John Doe"))));
这适用于noImplicitAny标志并编译.
答案越长越好
只需将其转换为类:
class person { constructor(public name: string) { } } let classPerson = person("John Doe");
这编译为:
var person = (function () { function person(name) { this.name = name; } return person; })(); var classPerson = new person("Jane Doe");
这是一个IIFE,在上面的简单案例中,与var person = function...
实现相比没有任何区别.它们完全是一回事.
将newable函数转换为类只是有益的.它使代码可读,更容易重构,并且将来更容易扩展/修改.它还有更好的类型信息(在这种情况下你甚至不需要接口).
简而言之,我没有理由在该解决方案的类版本上使用新功能版本.两个版本导致相同的对象(参考classPerson
和funcPerson
以上).
第三种选择
如果你有一个工作.js文件,你想与typescript一起使用,一个选项就是写一个.d.ts文件.在这种情况下,您可以执行以下操作:
person.js
var person = function(name) { this.name = name; }
person.d.ts
interface PersonStatic { name:string; new(name: string) : PersonStatic; } declare var person: PersonStatic;
当你使用它时,你将能够做到:
///var p = new person("Jane Doe");
它会起作用.
在这种情况下,person.js文件必须在运行时出现,以便javascript正确执行.上面的.d.ts文件是一个基本的例子,如果你决定沿着这条路走下去,我建议你先读一下创建.d.ts文件,然后再收费.