【问题标题】:Disjoint Union types based on object property literal type基于对象属性字面量类型的不相交联合类型
【发布时间】:2019-09-05 19:42:12
【问题描述】:

我正在尝试正确键入一个对象,该对象的定义会根据其属性之一的值而改变。在下面使用type 的常量可以正常工作(即:用type: 1 替换type: typeA 可以修复错误),但为了代码库的清晰性,我想使用从共享constants.js 导入的常量。为什么flow对此不满意?

const typeA = 1;
const typeB = 2;

type pA = {
  type: typeA,
    //  ^ Cannot use number as a type because number is a value. To get the type of a value use `typeof`.
  vA: string,
};

type pB = {
  type: typeB,
  vB: string,
};

type p = pA | pB;

const getV = (proj): string => {
    switch (proj.type) {
      case typeA: {
        return proj.vA;
      }
      case typeB: {
        return proj.vB;
      }
    }
  return '';
}

try it

【问题讨论】:

标签: javascript flowtype


【解决方案1】:

需要将A和B声明为类型,然后使用typeof进行切换

/* @flow */

type A = 1;
type B = 2;

type pA = {
  type: A,
  vA: string,
};

type pB = {
  type: B,
  vB: string,
};

type p = pA | pB;

const getV = (proj): string => {
    switch (proj.typeof) {
      case "A": {
        return proj.vA;
      }
      case "B": {
        return proj.vB;
      }
    }
  return '';
}

【讨论】:

  • 哇,这看起来很奇怪。它适用于此,但我认为我在实际代码库中遇到了另一个问题。感谢您的帮助!
  • proj.typeof 没有在p 的类型上定义;此外,它应该在12 上使用大小写,而不是在"A""B" 上。
猜你喜欢
  • 2020-09-27
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
相关资源
最近更新 更多