替换Flow类型中的对象属性的类型

时间:2016-10-27 11:41:26

标签: javascript flowtype

我们说我们已经定义了一个非常简单的对象类型:

type A = {
  foo: string,
  bar: number,
  // ... many other properties
};

现在我们要定义此类型的变体,只需将foo的类型替换为?string

type A2 = {
  foo: ?string,
  bar: number,
  // ... many other properties, with the same types as in A
};

如何做到这一点,而不必再次定义整个类型?

如果答案仅在T替换属性类型?T的特定情况下有效,那就足够了,因为这是我最常见的问题。

3 个答案:

答案 0 :(得分:3)

我可以想到两个解决方案:

1)参数类型别名

type Parametric<T> = {
  foo: T,
  bar: number,
  // ... many other properties
};

type A = Parametric<string>;
type B = Parametric<?string>;

2)十字路口

type Base = {
  bar: number,
  // ... many other properties
};

type A = Base & { foo: string };
type B = Base & { foo: ?string };

答案 1 :(得分:0)

我会使用精确类型的扩展运算符(在流程v0.42.0中引入)。

type A = {|
  foo: string,
  bar: number,
  // ... many other properties
|}

type A2 = {
   ...A,
   foo: ?string
}

注意:You need to use an exact type for A{| ... |}语法)。这是因为传播时流程如何处理未密封(非精确)类型。

答案 2 :(得分:0)

对于嵌套属性,您可以使用 $PropertyType<T, k> 实用程序。

type Type1 = {
  prop1: string,
  prop2: {
    a?: string,
    b?: number,
  }
}

type Type2 = {
  ...Type1,
  prop2: {
    ...$PropertyType<Type1, "prop2">,
    c: boolean,
  }
}

const obj: Type2 = {
  prop1: "foo",
  prop2: {
    a: "foo",
    c: true,
  }
}

const {
  prop2: {
    a,
    b,
    c
  }
}: Type2 = obj;

if (c === true) {
  // do something
}

flow.org/try