我们说我们已经定义了一个非常简单的对象类型:
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
的特定情况下有效,那就足够了,因为这是我最常见的问题。
答案 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
}