Как передать тип generi c в селектор generi c? - PullRequest
0 голосов
/ 30 января 2020

У меня проблема с Typescript, и я не знаю, как ее решить ...

Я создал общее состояние c для управления несколькими объектами. У каждой сущности есть собственный интерфейс, и каждый из них является частью универсального типа c (в моем примере это называется Reference).

Что я хочу: когда кому-то нужно вывести сущность из этого состояния, он указывает требуемый интерфейс в методе select (или selectReference?) И Typescript проверяет, является ли данный интерфейс частью Reference псевдоним типа.

Мои интерфейсы и псевдоним типа:

export interface A { propA: string; onch: string }
export interface B { propB: number; foo: boolean; hehe: string }
export interface C { propC: string; bar: number }
export interface D {}
export type Reference = A | B | C

Мой селектор:

export const selectReference = () => createSelector(selectRef, adapter.getSelectors().selectAll); // selectRef return an EntityState<Reference>

Мой компонент:

    export class MyComponent {
    collection$: Observable<Array<A>>;

        getCollection(): void {
            this.collection$ = this.store.pipe( select(fromReferencesSelectors.selectReference());
        }
    }

В этом примере ts linter показывает эту ошибку: Type 'Reference' is not assignable to type 'A'.

Как я могу это сделать?

Заранее спасибо:)

1 Ответ

0 голосов
/ 30 января 2020

Это не ответ сам по себе, но он может дать вам представление:

    export interface A { propA: string; onch: string; }
    export interface B { propB: number; foo: boolean; hehe: string; }
    export interface C { propC: string; bar: number; }
    export type Reference  = A | B | C;

       b: A;
       a: Reference = {
        propA: '', onch: 'string'
      };
        this.b = this.a; // this throws Type 'Reference' is not assignable to type 'A'.
            this.b = this.a as A; // this works

По моему опыту, вам всегда придется приводить его, чтобы явно сказать машинописи, какой тип вы ожидаете.

...