在结构化对象中强制类型

Enforce type in structured object

我们如何强制结构化对象中的属性类型? 在下面的代码中,我想避免在创建数组之前定义所有数组元素(第二个示例)。

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 ];

类型<UniversalConf>

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
  }
]

是一个assertion;它 抑制 类型检查,告诉编译器 "I know what this is"。相反,您想告诉编译器您希望标识符的类型是什么,并让它检查值:

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

如果您有一个可以包含多种可能类型的数组,您可以使用 union type 来表示它:

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