【发布时间】: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[] = [...]?<UniversalConf>[...]是 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