简短的错误答案
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 文件的内容。