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

2024-04-21

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

错误 TS7009:“新”表达式,缺少构造函数签名, 隐式具有“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 = <any>new Logger();//same error
//var defaultLogger: LoggerInstance = <LoggerInstance >new Logger();//same error

我不知道如何在不将 Logger 函数转换为类的情况下执行此操作。

如果没有隐式禁用任何功能,打字稿编译器会提出任何改进建议,因此我想保留该设置。

Update:如果我从 Logger 界面中删除“new”,然后转换 new Logger(...) 的结果,使其在完整文件中编译,但在我较小的测试示例中,我继续收到相同的错误。

Update 2好吧,我认为当红色下划线语法错误的插件崩溃时,错误警告就会消失。我认为当“隐式任何”被禁用时,必须禁止这种类型的对象创建。


简短的错误答案

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 http://benalman.com/news/2010/11/immediately-invoked-function-expression/,在上面的简单情况下,与var person = function...执行。它们是完全相同的东西。

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

简而言之,我认为没有理由使用可更新的函数版本而不是该解决方案的类版本。两个版本都会产生相同的对象(请参阅classPerson and funcPerson above).

第三种选择

如果您有一个可用的 .js 文件并希望与 Typescript 一起使用,则可以选择编写 .d.ts 文件。在这种情况下,你可以这样做:

person.js

var person = function(name) {
    this.name = name;
}

人.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 文件的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将新的 SomeFunction() 语法转换为 TypeScript? 的相关文章

随机推荐