TypeScript Union Type пропущенные свойства - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть 3 типа:

export type FooInitialStateType = {
  Id: string;
  Name: string;
  Email: string;
  Password: string
};

export type BarInitialStateType = {
  Id: string;
  Balance: number;
};

export type BazInitialStateType = {
  Id: string;
  Limit: number;
};

. Затем я создаю тип объединения следующим образом:

export type FooBarBazType = FooInitialStateType | BarInitialStateType | BazInitialStateType

Затем у меня есть метод generi c, который обрабатывает массивы, содержащие все 3 выше Типы:

  getFooBarBaz (
    events: FooBarBazType[]
  ): {
    foobarbaz0: FooBarBazType;
  } {
    const foobarbaz0 = <FooBarBazType>events[0];
    return {
      foobarbaz0
    };
  }

Затем я вызываю этот метод generi c для каждого класса (foo, bar, baz):

    const {
      foobarbaz0
    }: {
      foobarbaz0: FooInitialStateType;
    } = this.getFooBarBaz(fooEvents);

Я получаю ошибку TS:

Тип 'FooBarBazType' нельзя назначить типу 'FooInitialStateType'.

Поскольку FooInitialStateType не содержит свойств BarInitialStateType и BazInitialStateType.

Актуальные вопросы:

  1. Как я могу использовать тип объединения для метода generi c, чтобы принимать массив со всеми 3 типами, но затем, когда я вызываю метод, укажите какой точный тип возвращаемого значения должен быть?

  2. Является ли тип объединения правильной вещью для использования здесь? У меня есть один метод, который принимает 3 разных типов и производит один тип. Мне нужно, чтобы вызывающая функция знала и указывала возвращаемый тип

1 Ответ

0 голосов
/ 18 февраля 2020

Возможно, вы хотите, чтобы getFooBarBaz() была generi c функцией, где тип вывода зависит от типа ввода:

function getFooBarBaz<T extends FooBarBazType>(events: T[]): { foobarbaz0: T; } {
    const foobarbaz0 = events[0];
    return {
        foobarbaz0
    };
}

Тогда это может вести себя так Вы хотели бы:

const fooEvents = [
    {
        Id: "foo",
        Name: "Foobert",
        Email: "foobert@example.com",
        Password: "Emb4rr4ss|ngP455w%?d"
    }
];

const {
    foobarbaz0
}: {
    foobarbaz0: FooInitialStateType;
} = getFooBarBaz(fooEvents); // no error now

Это помогает? Удачи!

Детская площадка ссылка на код

...