Свойство справочного интерфейса Typescript собственное свойство - PullRequest
0 голосов
/ 06 ноября 2019

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

Обычно мы можем сделать это:

enum Sections {
  users = 'users',
  projects = 'projects'
}

interface SectionEles {
  [Section.users] : {...};
  [Section.projects]: {...};
}

interface SezViewSettings<S extends Sections> = {
  section: S;
  where: Array<keyof SectionEles[S]>;
}

Это прекрасно работает, но я хочу избежать SezViewSettings a generic. Я бы предпочел описать S из значения, присвоенного свойству section, что-то вроде этого:

interface SezViewSettings = {
  section: S extends Sections;
  where: Array<keyof SectionEles[S]>;
}

Можно ли это сделать?

1 Ответ

1 голос
/ 06 ноября 2019

Интерфейс не может представлять это ограничение без обобщений.

В этом случае ваши возможные S типы перечислимы , поэтому вы можете сформировать union из SezViewSettings<S> для всех возможных значений S и использоватьэто как твой тип. Этого может быть достаточно для ваших нужд.

Вот один из способов сделать это, сделав сопоставленный тип , свойства которого сразу ищутся :

type SezViewSettingUnion = { [S in Section]: SezViewSettings<S> }[Section]
/* type SezViewSettingUnion = SezViewSettings<Section.users> | 
     SezViewSettings<Section.projects>
*/

Аналогично, вы можете использовать условно-распределительные типы :

type _SezViewSettingUnion<S extends Section> =
    S extends any ? SezViewSettings<S> : never;
type SezViewSettingUnion = _SezViewSettingUnion<Section>;
/* type SezViewSettingUnion = SezViewSettings<Section.users> | 
SezViewSettings<Section.projects> */

Оба они в конечном итоге производят один и тот же тип, эквивалентный SezViewSettings<Section.users> | SezViewSettings<Section.projects>.


Хорошо, надеюсь, это поможет;удачи!
Ссылка на код

...