我正在试图弄清楚如何使用TypeScript提供的类型安全性和JS中的旧普通构造函数。我有一个非常简单的例子,看起来很简单,但我错过了一些东西,无法使用TypeScript进行编译:
interface IMyService {
new(): IMyService //I'm not sure if this line should be here, I just trying to make it working...
doSomething(name: string): void
}
function MyService(this: IMyService): void {
let _name = ""
this.doSomething = (name) => {
_name = name
}
}
//The line below won't compile and it saying:
//"new" expression, whose target lacks a construct signature, implicitly has an "any" type
let service = new MyService();
service.setName("Test Name")
我缺少什么?我知道使用TypeScript的首选方法是使用“class”,但在我的情况下,我想使用简单的构造函数。
答案 0 :(得分:0)
为什么不想为此使用TypeScript的类? https://www.typescriptlang.org/docs/handbook/classes.html
如果你的目标是正确的,它将编译成一个函数:TypeScript Playground
interface IMyService {
doSomething(name: string): void
}
class MyService implements IMyService {
constructor() {
}
doSomething(name: string) {
}
}
答案 1 :(得分:0)
你真的不能输入一个函数声明(或者至少我不知道如何)。但是,您可以键入变量,并为其分配函数。然后我们可以定义构造函数类型:
interface IMyService {
doSomething(name: string): void;
}
interface IMyServiceConstructor {
new(): IMyService;
}
const MyService: IMyServiceConstructor = function(this: IMyService){
//...
};
可以通过使用内联类型缩短:
const MyService: { new(): IMyService } = function(){
//...
};
答案 2 :(得分:0)
什么阻止你这样做:
class MyService {
// declare instance method
doSomething: (x: string) => void;
// this is really your function
constructor() {
let _name = "";
this.doSomething = (name) => {
_name = name;
}
}
}
let service = new MyService();
service.doSomething("Test Name");
这会发出与原始代码几乎相同的代码。它仍然使用构造函数作用域的变量local和实例方法而不是类方法。 (实例方法通常为frowned upon,因为您要为每个实例创建闭包,但这取决于您。)
TypeScript了解MyService
是新的,还有你想要的所有其他优点。跳过带有构造函数类型签名的箍并说服TypeScript你的函数是正确的类型对我来说似乎不值得。
希望有所帮助。