Typescript - 依赖于另一个可选属性的属性类型

Typescript - the type of property that depends on another optional property

提问人:Blackbetty 提问时间:10/26/2023 最后编辑:katnissBlackbetty 更新时间:10/27/2023 访问量:30

问:

我在 React 中有一个组件

const Faq = ({ shortVersion, data }: FaqProps) => { }

使用定义的类型


type FaqProps =
  | {
      shortVersion: true;
      data: ShortFaqData[];
    }
  | {
      shortVersion: false;
      data: ExtendedFaqData[];
    };

它有效

const testDataShort: ShortFaqData[]
const testDataExtended: ExtendedFaqData[]
<Faq shortVersion={false} data={testDataExtended} />
<Faq shortVersion data={testDataShort} />

但我希望 shortVersion 不必是假的,也可以是可选的

所以我试了这个

type FaqProps =
  | {
      shortVersion: true;
      data: ShortFaqData[];
    }
  | {
      shortVersion?: false;
      data: ExtendedFaqData[];
    };

还有这个

type FaqProps =
  | {
      shortVersion: true;
      data: ShortFaqData[];
    }
  | {
      shortVersion: false | undefined;
      data: ExtendedFaqData[];
    };

它不适用于没有 shortVersion 的情况(当我传递 shortVersion 时它有效)

case with passed shortVersion

case without passed shortVersion

是否可以使 IDE 建议正确的数据类型?

reactjs typescript 类型 条件语句 union

评论

0赞 Community 10/27/2023
请澄清您的具体问题或提供其他详细信息,以准确说明您的需求。正如目前所写的那样,很难确切地说出你在问什么。

答:

0赞 katniss 10/27/2023 #1

它是,有过载。这是我对你的现实世界问题的简化版本:

type Props = {
    flag: true;
    data: number;
} | {
    flag?: false;
    data: string;
};

通常,你会有这样的东西:

function Comp(props: Props) {

使用重载来描述道具(而不是依赖有区别的并集):

function Comp(props: { flag?: false; data: string }): JSX.Element;
function Comp(props: { flag: true; data: number }): JSX.Element;
function Comp(props: Props) {

现在,您将获得正确建议的类型:

<Comp data={} />; // hover over 'data' - it's shown as `string`!

但是,我认为您不应该依赖这种解决方法。相反,您应该将此问题作为问题提交给维护者并修复它。这种行为显然不理想,应该纠正。我真的想不出为什么这是理想的行为。

希望你能把这个例子应用到你的现实世界中。

操场

评论

0赞 Blackbetty 10/27/2023
是的,就是这样!我能够将其应用于我的情况。谢谢。