【问题标题】:How do I limit the suggested values in a property based on the value of another property?如何根据另一个属性的值限制属性中的建议值?
【发布时间】:2020-09-14 00:10:55
【问题描述】:

我正在尝试使用第三个接口/类型,其中第二个道具值将仅基于第一个道具值,并且第三个接口将具有第三个道具。我没有从前两个接口扩展第三个道具的原因是因为如果我在其他一些东西上使用它,我实际上并不需要它(而且我认为将其设为可选并不正确)

这就是我所做的:

  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_valuesB_prop2_values,而我只想要 A_prop2_values。我该如何完成这项工作?

编辑:我已按照建议更新了问题。我开始认为这是一个 IDE 问题,根本不是来自 Typescript(我没有检查 Typescript 日志)。默认情况下,我认为它确实结合了值,向您展示了这些值可能是什么,如果您选择了错误的东西,它会给您一个类型错误。

已解决,诚挚的歉意

【问题讨论】:

  • 我无法复制;你能提供实际类型而不是A_propX_value(s) 吗?通常,TS 会通过推断联合的一种或另一种类型来编译它,因为prop1 会在这里推断接口A,它应该可以工作。
  • 欢迎来到 Stack Overflow!请考虑编辑上述代码以构成minimal reproducible example 中提到的How to Ask;理想情况下,有人应该能够将您的代码放入独立的 IDE 中,例如 The TypeScript Playground,并为自己演示您的问题。祝你好运!
  • 大家好,感谢您的帮助。似乎我只是对打字稿如何显示建议感到困惑。我已经更新了问题正文,我认为我的问题已“解决”。真的很抱歉给您带来麻烦

标签: typescript


【解决方案1】:

在这里为像我这样懒惰阅读文档的人添加答案;显然,当您对直接常量 (const example = 'example') 执行 typeof 时,它会被推断为 'example' 而不是 'string',这在推断多种类型时会很有帮助。

当您为常量对象执行typeof 时,请确保:

  1. 声明后有as const
  2. 它们不包含${var}_example,否则它们将被推断为“字符串”,而不是您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多