- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当尝试将一个简单的 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))。
简而言之,我认为没有理由在该解决方案的类版本上使用新功能版本。两个版本都会产生相同的对象(请参阅上面的 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 文件的内容。
关于typescript - 如何将新的 SomeFunction() 语法转换为 TypeScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34098999/
我目前正在使用 Diab 4.4 C++ 编译器。这是一个完整的 POS,不符合 ANSI,我过去发现过它的问题。 我想知道下面的问题是编译器的问题,还是我对C++知识的不足 我意识到 x = x &
在这段代码中: function onHover_(){ $('p').css('background-color', 'red') ; } $( document )
我以这种方式向 WSDL 服务器发送请求: $soap = new SoapClient('WSDL_URI'); $soap->SomeFunction(array('Param1' => 123,
我知道 JavaScript 中的函数有双重生命,第一个是函数(作为创建实例的第一类事物),第二个是普通对象。 但是我很惊讶地看到下面控制台的输出。 function A() { consol
有什么区别 和 一个使用括号而不是另一个,但是使用其中任何一种有什么区别?什么是“正确”选项?如果我不使用任何 href 会发生什么属性? 据我所知,在 javascript 中,使用 somet
var funcHi = function() { var a=6; var b=5; return a+b; }; var withBrace = funcHi();
这个问题已经有答案了: Why does babel rewrite imported function call to (0, fn)(...)? (3 个回答) 已关闭 6 年前。 我正在使用 U
在阅读了绑定(bind)到 React ES6 类的方法的 bind 要求后,我对这个示例仍然遇到一些困难: class ProductList extends React.Component {
在网上查了一下,我还没有看到很多设置函数等于函数的例子。然而,在我发现的几个论坛中,似乎很多人都说这种方法没有得到广泛支持。 为了解释我的问题,我有一个表格,我想在上面实现这个:
我正在阅读某人的代码,我看到以下内容: this.device_name.changes().onValue(this.changeName.bind(this)) 据我了解,onValue 接受一个
我正在尝试传递一个动态加载的 dll 的类型(它使用一个接口(interface),但我需要conectrete implementation of this) to a function and a
我正在学习如何在 PHP 中使用 MySQL,在学习如何在数据库中调用 SQL 查询时,我看到程序方法包含以下 if 语句: if($result = mysqli_query($link, $que
如果某些东西使用了尚未定义的函数,为什么 JSLint 会提示?关键是该函数已定义 - 如果某个东西调用该函数,则该函数存在并且事情将会起作用。 看一下下面的代码: function foo() {
在我遇到的一个网络应用程序中,在 logout.jsp 中有一个 javascript 行: parent.parent.renderProcessingTextOff(); 在使用 IE 脚本调试器
我有一个表示函数参数列表的可变参数模板,例如: void myFunc (int,int,std::string) { } template class MyTemplateClass { }; ..
当尝试将一个简单的 JS 文件转换为禁用隐式“any”的 TS 文件时,出现此错误: error TS7009: 'new' expression, which lacks a constructor
我在很多地方都遇到过一些具有这种模式的代码: this.someFunction.call(this, param); 但在我看来这只是一种更冗长的打字方式 this.someFunction(par
请看一下这段代码。我需要显示一条警报消息“mikä on elämän tarkoitus?”使用此代码 window["mikä"]("on")("elämän")("tarkoitus")("?"
基本上我在标题中提到的是我正在尝试做的,我不确定是否可以做。 我有: $myClass = new Class(); $var = $myClass->someFunction(); 但后来我再也没有
我有一个关于 Javascript 在原型(prototype)、变量声明和构造函数方面的行为的问题。 为什么这有效: var myFunction = function(){ alert('some
我是一名优秀的程序员,十分优秀!