当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将新的SomeFunction()语法转换为TypeScript?》经验,为你挑选了1个好方法。

当试图将一个简单的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好的,我认为当红色下划线语法错误的插件崩溃时,错误警告就会消失.我认为当禁用"隐式任意"时,必须禁止这种对象创建方式.



1> Nypan..:

简短的错误答案

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

简而言之,我没有理由在该解决方案的类版本上使用新功能版本.两个版本导致相同的对象(参考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;

当你使用它时,你将能够做到:

/// 
var p = new person("Jane Doe");

它会起作用.

在这种情况下,person.js文件必须在运行时出现,以便javascript正确执行.上面的.d.ts文件是一个基本的例子,如果你决定沿着这条路走下去,我建议你先读一下创建.d.ts文件,然后再收费.

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有