一个角度类型的BehaviorSubject

问题描述 投票:0回答:6

假设我有一个模型用户。

我想创建一个User类型的BehaviorSubject,如下所示:

 private userSource = new BehaviorSubject<User>({});

有了这个声明,我收到以下错误:

  Argument of type '{}' is not assignable to parameter of type 'User'

任何人都可以帮我定义一个User类型的BehaviorSubject

angular rxjs
6个回答
0
投票

你需要通过User类型。 {}是一个初始值,它不遵循User的架构/类型。 Incase,你想传递一个空值使用null除了{}


3
投票

new BehaviorSubject<User>({}),你已经通过了BehaviorSubject的初始值。因为{}没有类型检测,你会收到错误。

你需要通过User类型。在{}中提供该类型的属性

private userSource = new BehaviorSubject<User>({ /* properties */ });

如果您不需要初始值。你可以使用ReplaySubject和重播计数设置为1

new ReplaySubject<User>(1)

这将提供相同的功能而没有初始值。


0
投票

你的User类型有一些必须具有属性。因此,空{}对象不能作为User的实例分配

例如,下面的User定义与{}不同:

interface User {
  name: string;
  address: string;
}

将上述内容更改为条件属性?将允许将空对象{}指定为user

例:

interface User {
  name?: string;
  address?: string;
}

0
投票

这是因为{}是一个与User不具有相同属性的对象(实际上它是一个空对象)。

您可以通过将{}投射到any来传递此信息:

new BehaviorSubject<User>({} as any);

0
投票

根据定义,BehaviorSubject需要初始值:

需要初始值并向新订户发出其当前值的主题

给定的初始值(在您的情况下为{})与您的User类型不兼容,后者可能包含一些必填字段。

所以创建一个用户:

const user: User = [...];
private userSource = new BehaviorSubject<User>(user);

如果您没有初始值,则可以选择ReplaySubject


0
投票

您需要提供值(满足“用户”模型类型)而不是“{}”

例如如果您的用户模型是这样的:

export interface User {
    name: string;
    id: string;
}

然后你的行为主题将是:

private userSource = new BehaviorSubject<User>({ 
     name: 'xyz',
     id: 'xyz'
});

要么

您可以将User模型中的所有属性设置为可选,如下所示:

export interface User {
    name?: string;
    id?: string;
}
© www.soinside.com 2019 - 2024. All rights reserved.