如何将新的SomeFunction()语法转换为TypeScript?

时间:2015-12-04 23:07:10

标签: typescript

当尝试将一个简单的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;时,必须禁止这种对象创建方式。被禁用。

2 个答案:

答案 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函数转换为类只是有益的。它使代码可读,更容易重构,并且将来更容易扩展/修改。它还有更好的类型信息(在这种情况下你甚至不需要接口)。

简而言之,我没有理由在此解决方案的类版本上使用新功能版本。两个版本都会生成相同的对象(请参阅上面的classPersonfuncPerson)。

第三个选项

如果你有一个工作的.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));