【问题标题】:typescript inform compiler about which union type is being used打字稿通知编译器正在使用哪种联合类型
【发布时间】:2021-03-04 23:02:17
【问题描述】:

假设我有以下类型:

type TMyType = {
  a: string;
  b: number;
  c: number;
  d?: SpecialTypeA | SpecialTypeB | SpecialTypeC;
}

如何告诉 typescript 在我的 (React) 子组件中我知道 d 是哪种类型?
我正在寻找类似data={data} as TMyType <SpecialTypeB>.
如果这是不可能的,那么最好和最容易理解的解决方案是什么,因为我们团队中的很多人都是使用 typescript 的新手

解决方案按照 AKX 建议:

type TMyType<T extends SpecialTypeA | SpecialTypeB | SpecialTypeC> = {
  a: string;
  b: number;
  c: number;
  d?: T;
}

对于我的反应父组件:

<ChildComponent data = {data as TMyType<SpecialTypeA>}/>

在子组件内部

interface IProps {
  data: TMyType<SpecialTypeA> 
}

【问题讨论】:

  • this 适合你吗?你需要留下TMyType还是可以修改它?

标签: reactjs typescript


【解决方案1】:

我只是将类型重写为

type TMyType<T> = {
  a: string;
  b: number;
  c: number;
  d?: T;
}

如果你想限制 T 的类型,你可以使用 &lt;T extends A | B | C&gt;

【讨论】:

  • 并且你想保留 TMyType 在没有类型参数的情况下使用,你可以将 T default 设置为 A | B | C。不确定d 的可选性是否也是一个问题
  • 就像一个魅力。我更新了我的答案以包括您的反应组件解决方案。如果您能仔细检查我是否理解正确,我将不胜感激!
  • @leviathan 很高兴我能帮上忙。您还可以使道具类型在 T 上通用,并且您根本不需要演员表......
  • @AKX 很抱歉打扰您,但您现在可能认为我也是打字稿的新手;)您最后的评论是什么意思?
  • 不需要演员也很好。因为我有通用组件,我只知道数据的类型是 TMyType,但是由于我将这些用于所有可能的 T 类型,所以我无法在这些中指定类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2022-09-29
  • 2021-08-05
  • 2018-12-06
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多