TypeScript: получить карту из различного объединения - PullRequest
0 голосов
/ 02 мая 2018

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

, например

export type Fetch = {
    type: 'fetch',
    dataType: string
};

export type Fetched<T> = {
    type: 'fetched',
    value: T
};

// union type discriminated on 'type' property
export type Action =
    | Fetch
    | Fetched<Product>;

// This produces a type 'fetch' | 'fetched'
// from the type 
type Actions = Action['type'];

// I want to produce a map type of the discriminator values to the types 
// comprising the union type but in an automated fashion similar to how I
// derived my Actions type.
// e.g.
type WhatIWant = {
    fetch: Fetch,
    fetched: Fetched<Product>
}

Возможно ли это в TypeScript?

1 Ответ

0 голосов
/ 02 мая 2018

С введением условных типов в TypeScript 2.8 вы можете определить функцию типа, которая, учитывая дискриминированное объединение, ключ и значение дискриминанта, создает единственную соответствующую составляющую объединения:

type DiscriminateUnion<T, K extends keyof T, V extends T[K]> = 
  T extends Record<K, V> ? T : never

И если вы хотите использовать это для построения карты, вы можете сделать это тоже:

type MapDiscriminatedUnion<T extends Record<K, string>, K extends keyof T> =
  { [V in T[K]]: DiscriminateUnion<T, K, V> };

Так что в вашем случае,

type WhatIWant = MapDiscriminatedUnion<Action, 'type'>;

который, если вы его осмотрите, будет:

type WhatIWant = {
  fetch: {
    type: "fetch";
    dataType: string;
  };
  fetched: {
    type: "fetched";
    value: Product;
  };
}

как хотелось бы, я думаю. Надеюсь, это поможет; удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...