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

标签 typescript

当尝试将一个简单的 JS 文件转换为禁用隐式“any”的 TS 文件时,出现此错误:

error TS7009: 'new' expression, which lacks a constructor signature, implicitly has an 'any' type.

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 函数转换为类,我不知道该怎么做。

在没有隐含任何禁用的情况下, typescript 编译器正在提出任何改进建议,所以我想保留该设置。

更新:如果我从 Logger 接口(interface)中删除“new”,然后转换 new Logger(...) 的结果,让它在完整文件中编译,但在我的小测试中例如,我继续得到同样的错误。

更新 2 好吧,我认为当用红色下划线标明语法错误的插件崩溃时,错误警告消失了。我在想,当禁用“implicit any”时,必须禁止这种对象创建方式。

最佳答案

简短的错误答案

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... 实现相比没有任何区别。它们是完全一样的东西。

将可更新的函数转换为一个类只是有益的。它使代码可读,更容易重构,也更容易在将来扩展/修改。它还具有更好的类型信息(在这种情况下您甚至不需要接口(interface))。

简而言之,我认为没有理由在该解决方案的类版本上使用新功能版本。两个版本都会产生相同的对象(请参阅上面的 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 文件的内容。

关于typescript - 如何将新的 SomeFunction() 语法转换为 TypeScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34098999/

相关文章:

javascript - 为什么 ngOnChanges() 在 @Input() 更新数据 Angular 8 时不会触发?

node.js - 在 node.js(和 Angular 2)上使用 systemjs

Angular 监听 rxjs observable 的订阅开始?

Javascript:根据多个值过滤对象数组

html - 如果我单击 Angular 中的类,则隐藏 div

reactjs - 如何使变量的类型为未知或 'Movie' 分配?

javascript - Angular v2.0.0 与 v5.1.2

arrays - TypeScript 和数组 reduce 函数

javascript - TypeScript 定义文件必须位于包的根目录吗?

javascript - TypeScript 类函数作为函数 VS 变量具有更好的性能