根据socially project,我尝试扩展用户以添加字段:
export interface User extends Meteor.User {
experience: number;
}
但是我收到以下错误:
client/imports/app/parties/party-details.component.ts (71, 7): Type 'Observable<User[]>' is not assignable to type 'Observable<User>'.
Type 'User[]' is not assignable to type 'User'.
Property 'experience' is missing in type 'User[]'.
据我所知,这是因为集合定义:
export const Users = MongoObservable.fromExisting(Meteor.users);
它使用Meteor.users
(没有experience field
)而不是我自定义的打字稿定义版本(使用experience field
)。
相关文件:
我该如何解决?或者换句话说:如何扩展角度流星项目的用户模型?
我想将问题重新解释为:如何扩展Meteor用户集?
export const Users = MongoObservable.fromExisting(Meteor.users);
加分问题:在创建新用户时,如何使用0
启动字段?
答案 0 :(得分:1)
但是我收到以下错误:
您必须将第31行更改为
users: Observable<User[]>;
代替users: Observable<User>;
虽然我甚至没有在没有更改的情况下抛出错误,所以我不知道错误应该何时发生?
无论如何,Meteor Collection查找总是返回一个对象数组,因此users: Observable<User[]>;
是正确的。
如何扩展Meteor用户集?
至于如何扩展用户: 从技术上讲,您甚至不必为了存储额外的值而扩展它,您为插入的Collection提供的所有值都将存储在该文档中。 扩展的意思是,扩展要插入的用户文档的模型/模式。使用TypeScript时,这通常只是一个接口,但如果您不使用TS,则会有https://github.com/aldeed/meteor-simple-schema等替代方法实际提供设置默认值。我只是这样说是为了帮助你理解这个概念。
虽然界面只会对值进行整形,但它不会设置默认值或类似的值。例如,AFAIK与Java中的接口相同。
所以你所做的就是扩展那个界面,就像你说的那样:
export interface User extends Meteor.User {
experience: number;
}
这应该是正确的。你不能扩展“集合”,集合只是在MongoDB中定义集合名称,可能还有谁可以访问它。
如何在创建新用户时使用0启动字段
如前所述,您无法为接口设置默认值。您所能做的就是使用experience? : number
将值设置为可选,这会将其设置为undefined。
但是,您可以创建一个实现该接口的类,然后设置默认值。
export class SignupUser implements User{
experience:number=0;
email: string;
password: string;
}
然后在第29行的signup.component.ts
你可以做
let signupUser=new SignupUser();
signupUser.email= this.signupForm.value.email;
signupUser.password= this.signupForm.value.password;
Accounts.createUser(signupUser, err => [...])
甚至可以立即创建一个新的SignupUser并直接绑定到这些值。
或者你也可以这么简单的方式
Accounts.createUser({
experience: 0,
email: this.signupForm.value.email,
password: this.signupForm.value.password
}
我希望这会对你有所帮助。
答案 1 :(得分:0)
看起来您的问题是,您尝试将用户数组Observable<User[]>
的Observable分配给用户Observable<User>
的Observable。您是否错误地将Observable<User[]>
应用为MongoObservable的类型?