angular - 打字稿输入问题,Observable.next 方法未正确输入
问题描述
大家好,我真的坚持以下几点:
代码:
数据库.propertiesClass.ts
import { Subject } from "rxjs/";
interface HomepageTextItems {
header: string;
items: string[];
}
export interface HomepageText {
basics: HomepageTextItems;
advanced: HomepageTextItems;
practice: HomepageTextItems;
blog: HomepageTextItems;
}
interface DataObject<T> {
value?: T;
observable: Subject<T>;
}
export class DataBankItems {
public homepageText: DataObject<HomepageText> = this.createDataObject();
// public website: DataObject<string> = this.createDataObject();
public website2: DataObject<number> = this.createDataObject();
private createDataObject<T>(): DataObject<T> {
return {
value: undefined,
observable: new Subject<T>(),
};
}
}
数据库-services.ts
import { Injectable } from "@angular/core";
import { DataBankItems } from "./data-bank.propertiesClass";
// Important unsubscribe from the Subjects is the resonsibility of the subscribers in ngOnDestroy!
@Injectable({
providedIn: "root",
})
export class DataBankService {
private dataBank = new DataBankItems();
public updateValue<T extends keyof DataBankItems>(
property: T,
newValue: DataBankItems[T]["value"]
): void {
this.dataBank[property].value = newValue;
this.dataBank[property].observable.next(newValue);
}
public getObservable<T extends keyof DataBankItems>(property: T): DataBankItems[T]["observable"] {
return this.dataBank[property].observable;
}
public getValue<T extends keyof DataBankItems>(property: T): DataBankItems[T]["value"] {
return this.dataBank[property].value;
}
}
我在该行中收到以下错误(strictnullchecks 已打开)
this.dataBank[property].observable.next(newValue);
'DataBankItems[T]["value"]' 类型的参数不可分配给 '(HomepageText & number) 类型的参数 | 不明确的'。输入'号码 | 首页正文 | undefined' 不可分配给类型 '(HomepageText & number) | 不明确的'。
我已经尝试过使用 !== undefined 的非空运算符和类型保护,但到目前为止还没有运气。
问题似乎是下一个函数需要类型:
'(HomepageText & number) | undefined'
但是得到:
'HomepageText | number | undefined'
这是类型===DataBankItems[T]["value"]
我真的很困惑为什么它会期待'(HomepageText & number) | undefined'
。这对我来说似乎是一种虚假的类型。
解决方案
老实说,我不知道打字稿编译器在这种情况下是如何工作的。
但是,如果您检查的类型this.dataBank[property].observable
将是Subject<HomepageTest> | Subject<number>
. 显然,这Subject<HomepageTest | number>
与 typescript 期望next()
函数是类型交集(HomepageTest & number
)而不是类型联合(HomepageTest | number
)不同。
作为一个快速的解决方案,您可以存储类型newValue
并将 observable 转换为接受该类型:
public updateValue<T extends keyof DataBankItems>(
property: T,
newValue: DataBankItems[T]["value"]
): void {
type P = DataBankItems[T]["value"];
this.dataBank[property].value = newValue;
(this.dataBank[property].observable as Subject<P>).next(newValue);
}
推荐阅读
- angularjs - 如何实现显示更多
- 使用 angularjs ng-repeat 指令?
- google-apps-script - Google App Script 是否有键值对?
- nunit - Nunit:ParallelScope Self+Children、Fixture+Children 和 All 之间的区别
- docker - 上下文截止日期延长 - prometheus - 在 docker 上运行时
- python - 生成连接 2 个点的线的像素值
- r - R:添加第二个 x 轴的解决方法(只需要信息)
- jenkins - 如何在 Jenkins 中签出 Bitbucket Git-LFS 存储库?
- sql - SQL Server 排序
- paperjs - paperjs 绘制一个指定长度的点
- python - 使用 python、regex 和 glob 查找最新文件