Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在typescript类之外定义静态方法_Typescript - Fatal编程技术网

在typescript类之外定义静态方法

在typescript类之外定义静态方法,typescript,Typescript,我有一个使用Sequelize构建的api。它的结构使得在一个地方定义了基础模型,在另一个地方定义了它们各自的类方法。这样做是为了让模型可以自己导出,或者构建为包含所有额外的类方法 例如,这里有一个线程模型: ///型号/thread.ts 类线程扩展模型{ id:字符串; 公共静态createOne:=>void; ... } 线程模型最终将与所有其他模型一起导出: //./models/index.ts 从“/Thread”导出{default as Thread}; 从“./Message

我有一个使用Sequelize构建的api。它的结构使得在一个地方定义了基础模型,在另一个地方定义了它们各自的类方法。这样做是为了让模型可以自己导出,或者构建为包含所有额外的类方法

例如,这里有一个线程模型:

///型号/thread.ts 类线程扩展模型{ id:字符串; 公共静态createOne:=>void; ... } 线程模型最终将与所有其他模型一起导出:

//./models/index.ts 从“/Thread”导出{default as Thread}; 从“./Message”导出{default as Message}; ... ///index.ts 从“./models”导入*作为模型; 导出接口IModels{ 线程:模型。线程, ... } 导出{models} 下面是为向线程添加类方法而定义的函数。这将传递给models对象,这样做是为了在编写依赖于其他模型的方法时避免循环依赖:

const addThreadClassMethods=models:IModels=>{ //抛出属性“createOne”是类型为“Thread”的静态成员 models.Thread.createOne==>{…} } 这在功能上是有效的,但typescript会抛出一个错误,指出属性“createOne”是“Thread”类型的静态成员。起初这对我来说是有意义的,但后来我意识到我可以在不抛出错误的情况下执行以下操作:

从“./models/Thread”导入线程; //没有错误 Thread.createOne==>{…}
在第一种情况下,我修改了作为函数参数成员的类的属性,而在后一种情况下,我直接修改了该类的属性。这实际上不是一回事吗?

Typescript具有变量名范围和类型名范围。 IModel的属性名为“Thread”,类型名为“Thread”

当您声明任何类时,typescript会为您做两件事。 1:类名称的变量映射到构造函数。 2:类的名称类型映射到类的实例类型而不是类

要解决问题,请将IModel更改为

{
    Thread: typeof models.Thread
}