TypeScript中的构造函数,缺少什么?

时间:2018-01-13 23:09:55

标签: javascript typescript oop

我正在试图弄清楚如何使用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”,但在我的情况下,我想使用简单的构造函数。

3 个答案:

答案 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你的函数是正确的类型对我来说似乎不值得。

希望有所帮助。