首页 > 解决方案 > 打字稿输入问题,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'。这对我来说似乎是一种虚假的类型。

标签: angulartypescripttypescript-typings

解决方案


老实说,我不知道打字稿编译器在这种情况下是如何工作的。

但是,如果您检查的类型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);
    }

推荐阅读