私はモデルを持っていますUser
:
export class User {
id: number;
roles: Role[];
hasRole(role: string) { return true; }
}
また、ユーザーサービスでは、ジェネリックを使用して応答をそのモデルにマッピングしています。
getById(id: number) {
return this.http.get<User>(`/api/v1/admin/users/${id}`);
}
そして、コンポーネントで、hasRole
メソッドを呼び出そうとしています。
ngOnInit() {
this.userService.getById(1).subscribe(data => this.user = data);
}
checkRole() {
return this.user.hasRole();
}
電話した後checkRole
、次のメッセージが表示されます。
TypeError:this.user.hasRoleは関数ではありません。
どうすれば修正できますか?
タイプパラメータを渡すとき、get
実際にget
は内部で行うことを変更していません。つまり、サーバーからデータを取得し、それをオブジェクトに解析します(JSON.parse
ほとんどの場合を使用)。パラメータを渡す理由は、サーバーから取得するオブジェクトを入力するためですが、オブジェクトは実際にはクラスのインスタンスではなく、単純なオブジェクトのままです。この混乱を避けるために、typeパラメーターとしてフィールドのみを含むインターフェースを使用し、User
inのインスタンスを作成できます。subscribe
this.userService.getById(1).subscribe(data => this.user = Object.assign(new User(), data));
または、よりタイプセーフな方法で、から返されたデータgetById
が実際のインスタンスであると誰も思わないようにしますUser
。
type DataKeys<T> = { [P in keyof T] : T[P] extends Function ? never : P }[keyof T]
type Data<T> = Pick<T, DataKeys<T>>;
getById(id: number) {
return this.http.get<Data<User>>(`/api/v1/admin/users/${id}`);
}
this.userService.getById(1).subscribe(data => this.user = Object.assign(new User(), data));
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加