Typescript 从函数工厂和类推断成员的类型脚本

Typescript 从函数工厂和类推断成员的类型脚本,typescript,Typescript,使用类,我可以直接访问成员,而无需typescript typechecker投诉,但当我使用typeof时,使用工厂函数,它表示该属性不存在 function serviceFunc() { function add(){ //logic... } return { add } } class ServiceClazz{ private val; constructor() { this.val = 0; } add(){

使用类,我可以直接访问成员,而无需typescript typechecker投诉,但当我使用typeof时,使用工厂函数,它表示该属性不存在

function serviceFunc() {
  function add(){
    //logic...
  }
  return {
    add
  }
}

class ServiceClazz{
  private val;
  
  constructor() {
    this.val = 0;
  }
  add(){
    console.log(this.val);
  }
}

const func1: typeof serviceFunc = serviceFunc();


//property add does not exist...
serviceFunc.add();

//doesn't complain about add...
const func2: ServiceClazz = new ServiceClazz();
func2.add();

这是否意味着我必须使用接口定义serviceFunc才能获得打字?在这种情况下,类似乎受益匪浅,还是我遗漏了什么?

这只是一个打字错误吗?无法写入
const func1:typeof serviceFunc=serviceFunc()
,原因与无法写入
const func2:typeof ServiceClazz=new ServiceClazz()
相同;构造函数不是它构造的对象,函数也不是它返回的值。类似地,您不能调用
serviceFunc.add()
,原因与您不能调用
ServiceClazz.add()的原因相同。相反,如果你写

const func1 = serviceFunc();
func1.add();
它会起作用的。如果确实要为
func1
提供类型注释,可以使用以下命令:

const func1: ReturnType<typeof serviceFunc> = serviceFunc();

有意思,我来试试。谢谢。我明白了,所以如果我将serviceFunc()返回值传递给另一个函数,我会使用ReturnType。那是为了我。非常感谢。我仍然需要浏览typescript站点的参考部分。谢谢你的澄清。干杯
/* const func1: {
    add: () => void;
} */