【发布时间】:2022-01-20 22:42:40
【问题描述】:
我有一个包含 3 个变体的反应组件。我的道具是这样输入的:
enum VariantType {
VARIANT_1 = "variant_1",
VARIANT_2 = "variant_2",
VARIANT_3 = "variant_3",
}
type BaseProps = {
a: string;
}
type Variant1Props = BaseProps & {
variant: VariantType.VARIANT_1;
b: never;
}
type Variant2Props = BaseProps & {
variant: VariantType.VARIANT_2;
b: number;
}
type Variant3Props = BaseProps & {
variant: VariantType.VARIANT_3;
b: boolean;
}
export const FancyComponent: FunctionComponent<Variant1Props | Variant2Props | Variant3Props> = (props) => {
const someNumber = props.variant === VariantType.VARIANT_2 ? props.b : 123;
...
}
在 someNumber 的分配中,TS 知道 b 是定义的,因为我检查了变体。当使用组件时,当b 存在时,TS 会抱怨VARIANT_1,当b 不存在/不是数字时,它会抱怨VARIANT_2(VARIANT_3 相同)。
我现在正在寻找的是一种在使用组件时使 variant 选项可选的方法,它应该默认为 VARIANT_1 并且您可以将其设置为 VARIANT_2 或 VARIANT_3 而不会丢失任何我现在拥有的类型安全。
我尝试过使用泛型等的东西,但无法正常工作。
我正在使用 Typescript 4.5。
【问题讨论】:
标签: reactjs typescript react-typescript discriminated-union typescript-types