我不知道如何正确描述这一点,所以让我举个例子。我有一个库,它返回一个用作构造函数的函数:
var userTemplate = lib.User;
var user = new userTemplate();
我想将其强烈键入userTemplate
为一个类,因为我知道它将具有哪些属性。我还希望能够在应用程序的其他部分做一些事情,比如var user = new userTemplate()
让user
对象成为某种已知类型。
我觉得我需要在这里使用环境类声明,但我不确定如何将环境声明分配给实际构建器的引用?
例如,我想要这样的东西:
export class Storage{
init(){
// somehow define that when you
// new a User to call this function
User = lib.User;
}
}
declare class User{
public name:string;
}
基本上我想以某种方式定义声明实际用户的代码在哪里。根据我对环境声明的了解,它们在“其他地方”被指定。我无法弄清楚这个“其他地方”实际上在哪里。我检查了一个打字稿示例,但我没有看到 mongodb 环境声明是如何映射到实际实现的。
我觉得我在这里错过了一块拼图。
编辑(带有细节)
让我在这里具体说一下:
我正在尝试使用强类型猫鼬。想象一下我有一个 Schema 类:
export class Schema{
public UserData:User;
constructor(){
var mongoose:IMongooseBase = require("mongoose");
var mongooseSchema = <MongooseSchema>mongoose.Schema;
var user = new mongooseSchema({
name: String
});
this.UserData = mongoose.model("User", user);
}
}
export declare class User extends MongooseBase{
constructor(item:any);
public _id: string;
public name: string;
}
declare class MongooseBase {
findOne(item:any, callback:ICallback) : void;
find(id:string, callback?:ICallback) : IChainable;
save(item: IEmptyCallback) : void;
remove(item:any, callback:IErrorCallback) : void;
push(item:MongooseBase):void;
}
interface IMongooseSchema{
ObjectId:String;
}
declare class MongooseSchema implements IMongooseSchema{
constructor(item:any);
public ObjectId:String;
}
interface IMongooseBase{
model(name:String, ref:any):any;
Schema():any;
}
Mongoose 的模型函数为我提供了一个用作构造函数的函数。使用此对象创建任何新模型类型都将具有定义的属性MongooseBase
(例如 find、findOne 等)。我还希望该用户将用户属性定义为环境类User
(名称)中定义的架构的一部分。
因此,例如,在 javascript 中这类似于
var userProxy = mongoose.Schema("User", user);
var userData = new userProxy();
用户对象包含从猫鼬给你的任何东西(我已经映射到MongooseBase
定义)继承的属性。它还为您提供了作为初始模式创建的一部分传入的属性(当我定义时user
)。
我希望能够强类型这个代理,像这样
var user:UserData = new schema.UserData();
如果我这样做,打字稿编译器会崩溃并出现以下异常,这让我相信我正在做一些非常古怪且可能不正确的事情:
\AppData\Roaming\npm\node_modules\typescript\bin\tsc.js:24488
throw err;
^
TypeError: Cannot read property 'construct' of null
at TypeFlow.typeCheckNew (\AppData\Roaming\npm\node_modules\typescript\bin\tsc.js:20675:27)
at CallExpression.typeCheck (\AppData\Roaming\npm\node_modules\typescript\bin\tsc.js:1275:33)
at TypeFlow.typeCheck (\AppData\Roaming\npm\node_modules\typescript\bin\tsc.js:18505:28)
at TypeChecker.typeCheckWithContextualType (\AppData\Roaming\npm\node_modules\typescript\bin\tsc.js:15909:27)
at TypeFlow.typeCheckBoundDecl (\AppData\Roaming\npm\node_modules\typescript\bin\tsc.js:18647:38)
at VarDecl.BoundDecl.typeCheck (\AppData\Roaming\npm\node_modules\typescript\bin\tsc.js:1631:29)
at ASTList.typeCheck (\AppData\Roaming\npm\node_modules\typescript\bin\tsc.js:1016:55)
at TypeFlow.typeCheck (\AppData\Roaming\npm\node_modules\typescript\bin\tsc.js:18505:28)
at TypeFlow.typeCheckFunction (\AppData\Roaming\npm\node_modules\typescript\bin\tsc.js:19815:22)
at FuncDecl.typeCheck (\AppData\Roaming\npm\node_modules\typescript\bin\tsc.js:1783:29)
编辑 2
因此,我设置它的方式在 webstorm 中没有出现任何错误,并且为其他文件生成的代码确实可以正常工作(它与我自己编写的 javascript 匹配),但是 typescript 编译器崩溃并且不会更新了我使用参考的文件。