Как ограничить предлагаемые значения свойства на основе значения другого свойства? - PullRequest
0 голосов
/ 27 мая 2020

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

Итак вот что я сделал:

  1. Создайте два интерфейса A и B, которые имеют одинаковые свойства, но могут иметь разные значения
  2. Создайте тип, в котором это объединение двух интерфейсов
  3. Создайте новый тип, содержащий третье свойство, и смешайте его с объединением двух типов

Вот как я это делаю

 const A_PROP1 = 'A_PROP1';
 const A_PROP2_VALUES = {
  type1: 'type1',
  type2: 'type2',
  type3: 'type3',
};

 const B_PROP1 = 'B_PROP1';
 const B_PROP2_VALUES = {
  type4: 'type4',
  type5: 'type5',
};

 interface A {
  prop1: typeof A_PROP1;
  prop2: keyof typeof A_PROP2_VALUES;
 }

 interface B {
  prop1: typeof B_PROP1;
  prop2: keyof typeof B_PROP2_VALUES;
 }

 type AB = A | B;

 type ABC = AB & {
  prop3: 'prop3_value';
 }

Однако, когда я делаю следующее

const test: ABC = {
 prop3: 'prop3_value',
 prop1: A_PROP1,
 prop2: 'random entered value', //The suggestion for this one shows the combination of A_PROP2_VALUES and B_PROP2_VALUES 
}

prop2 показывает предупреждение, где оно объединяет A_prop2_values и B_prop2_values, где мне нужен только A_prop2_values. Как мне это сделать?

Изменить: я обновил вопрос, как было предложено. Я начинаю думать, что это проблема IDE, а не от Typescript вообще (я не проверял журнал Typescript). По умолчанию, я думаю, он объединяет значения, показывающие вам, какими могут быть значения, и если вы выберете что-то неправильное, он выдаст вам ошибку типа.

Это решено, мои искренние извинения

1 Ответ

0 голосов
/ 09 июня 2020

Добавление сюда ответа для людей вроде меня, ленивых читать документацию; очевидно, когда вы выполняете typeof с прямой константой (const example = 'example'), он выводится как 'example', а не как 'string', что будет полезно при выводе нескольких типов.

Когда вы ' повторяя typeof для объекта констант, убедитесь, что:

  1. у вас есть as const после объявления.
  2. они не содержат ${var}_example, потому что в противном случае они будут считаться "строками", а не той, которую вы хотели.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...