Обеспечить тип в структурированном объекте - PullRequest
0 голосов
/ 30 марта 2020

Как мы можем обеспечить тип свойств внутри структурированного объекта? В приведенном ниже коде я хотел бы избежать определения всех элементов массива (второй пример) перед созданием массива.

type EcommerceFlow =  ("REVENUE" | "ATC" | "ADD_INSURANCE" );
interface UniversalConf {
  trackingId: string;
  eCommerceFlows: Array<EcommerceFlow>;
}

// how to keep this syntax (single object declaration) with compiler checks?
const providers = [
  <UniversalConf> {
    "providerCode": "UA", // Compiler does not complain about non-defined property
    "trackingId": "XXXXXXXXXX",
    "eCommerceFlows": ["REVENUE", "BAD_FLOW"] // Compiler does not complain about BAD_FLOW
  }
]

const uaConf:UniversalConf = {
  "providerCode": "UA", // Compiler complains about non-defined property
  "trackingId": "XXXXXXXXXX",
  "eCommerceFlows": ["REVENUE", "BAD_FLOW"] // Compiler complains about BAD_FLOW (and this is fine)
};
const providers2 = [ uaConf ];

1 Ответ

1 голос
/ 30 марта 2020

Тип <UniversalConf> in

const providers = [
  <UniversalConf> {
    "providerCode": "UA", // Compiler does not complain about non-defined property
    "trackingId": "XXXXXXXXXX",
    "eCommerceFlows": ["REVENUE", "BAD_FLOW"] // Compiler does not complain about BAD_FLOW
  }
]

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

const providers: UniversalConf[] = [
  {
    "providerCode": "UA",
    "trackingId": "XXXXXXXXXX",
    "eCommerceFlows": ["REVENUE", "BAD_FLOW"]
  }
]

Если у вас есть массив, который может содержать несколько возможных типов, вы можете использовать тип объединения для представления:

const providers: (UniversalConf | ...)[] = [
  {
    "providerCode": "UA",
    "trackingId": "XXXXXXXXXX",
    "eCommerceFlows": ["REVENUE", "BAD_FLOW"]
  }
]
...