【问题标题】:Enforce type in structured object在结构化对象中强制类型
【发布时间】:2020-07-10 15:36:42
【问题描述】:

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

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

【问题讨论】:

  • const providers: UniversalConf[] = [...]? &lt;UniversalConf&gt;[...]assertion,它告诉编译器 UniversalConf(即使它不这么认为)。但请注意,拥有一个额外的道具不是问题,因为任何消耗 UniversalConf 的东西无论如何都无法访问它。
  • 我理解断言部分,但我想要一种方法来进行真正的类型检查(类似声明),同时保持单一对象结构。另外,对我来说,额外的属性是一个问题,因为我想确保在编译时其他开发人员没有拼写错误(实际上我的类型更复杂,带有可选属性。可选属性可能会被误写而没有错误) .
  • const providers: UniversalConf[] = [] 为您提供类型检查。但据我所知,仅在分配单个对象文字时才检查额外的道具。在某个时候,您必须依赖基本能力 - 无论如何,IDE/编辑器可能会建议/自动完成“预期的”可选名称,如果它们是可选的,那么缺少它们不应该破坏任何编译明智的(测试仍然会虽然功能错误但失败)。
  • 是的。不幸的是,这个数组可以包含其他类型(同样的问题存在)确实它会编译但它不会像开发人员所期望的那样运行(调试,浪费时间,......))
  • 这不是问题,而是const providers: (UniversalConf | ...)[]?如果值与允许的 any 内容不匹配,您将收到错误消息。或者const providers: [UniversalConf, ...],如果它们在位置上是已知的:typescriptlang.org/docs/handbook/basic-types.html#tuple

标签: typescript types casting declaration


【解决方案1】:

&lt;UniversalConf&gt; 中的类型

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;它抑制类型检查,告诉编译器“我知道这是什么”。相反,您想告诉编译器您期望标识符的类型是什么,并让它检查值:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多