当尝试将一个简单的JS文件转换为具有隐式"任何"的TS时禁用,我收到此错误:
错误TS7009:' new'表达式,缺少构造函数签名, 隐含地有一个“任何”的类型。
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 = <any>new Logger();//same error
//var defaultLogger: LoggerInstance = <LoggerInstance >new Logger();//same error
我没有看到如何在不将Logger功能转换为类的情况下执行此操作。
没有隐式任何禁用,打字稿编译器提出了任何改进建议,所以我想保留该设置。
更新:如果我删除&#34; new&#34;从Logger接口然后转换新Logger(...)的结果,让它在完整文件中编译,但在我较小的测试示例中,我继续得到相同的错误。
更新2 好的,我认为当红色下划线语法错误的插件崩溃时,错误警告就会消失。我认为,当隐藏任何&#34;隐藏任何&#34;时,必须禁止这种对象创建方式。被禁用。
答案 0 :(得分:6)
简短的错误答案
interface IPerson {
name: string;
}
var person = function(name: string) : void {
this.name = name;
}
let funcPerson = <IPerson>(new (<any>(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;
当你使用它时,你可以这样做:
/// <reference path="your.d.ts"/>
var p = new person("Jane Doe");
它会起作用。
在这种情况下,person.js文件必须在运行时出现才能使javascript正确执行。 上面的.d.ts文件是一个基本的例子,如果你决定沿着这条路走下去,我建议你先读一下创建.d.ts文件,然后再收费。
答案 1 :(得分:1)
定义类型和类型的构造函数结构。接口可以正常工作。
type PersonType = {
name: string;
greet: (otherPerson: PersonType) => string;
selfIntroduce: () => string;
}
//ordinary functions are called with or without the "new" operator and
//the constructor's type must indicate both signatures
type PersonTypeConstructor = {
(this: PersonType, name: string): void; //<- "this" could be omitted here
new(name: string): PersonType; // <- "this" must not appear here
}
定义将用作构造函数的函数。必须将 此 指定为第一个参数(自TS 2.0起),因此当 noImplicitThis 标志设置为true时,编译器不会抱怨。
const Person = (function Person(this: PersonType, name: string) {
this.name = name;
}) as PersonTypeConstructor; // <- cast the constructor here so no other cast will be necessary.
Person.prototype.greet = function (otherPerson: PersonType) {
return `Hello, ${otherPerson.name}!`;
};
Person.prototype.selfIntroduce = function () {
return `Hello, my name is ${this.name}.`;
};
let peggySue = new Person("Peggy Sue");
let maryAnn = new Person("Mary Ann");
console.log(maryAnn.selfIntroduce());
console.log(peggySue.greet(maryAnn));