Javascript 基于对象属性文字类型的不相交联合类型

Javascript 基于对象属性文字类型的不相交联合类型,javascript,flowtype,Javascript,Flowtype,我试图正确地键入一个对象,该对象的定义根据其某个属性的值而更改。为下面的type使用常量可以很好地工作(即:将type:typeA替换为type:1修复了错误),但为了代码库的清晰性,我想使用从共享constants.js导入的常量。为什么flow对此不高兴 const typeA = 1; const typeB = 2; type pA = { type: typeA, // ^ Cannot use number as a type because number is a

我试图正确地键入一个对象,该对象的定义根据其某个属性的值而更改。为下面的
type
使用常量可以很好地工作(即:将
type:typeA
替换为
type:1
修复了错误),但为了代码库的清晰性,我想使用从共享
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 '';
}

您需要将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 '';
}

哇,这看起来真奇怪。这是可行的,但我认为我的实际代码库中还有另一个问题。谢谢你的帮助<代码>项目类型未在
p
类型上定义;此外,它应该是
1
2
上的外壳,而不是
“A”
“B”
上的外壳