【问题标题】:Return type: Require properties of a specific type, but allow it to be partial返回类型:需要特定类型的属性,但允许它是部分的
【发布时间】:2018-09-29 07:07:02
【问题描述】:

我正在寻找一种在打字稿中实现以下目标的方法: 我想强制方法的返回类型是接口的子集。因此,换句话说:返回对象的所有属性都必须存在于接口上,但并非所有属性都是必需的。

背景:react 的部分状态更新。
我刚刚遇到了一个错误,我重命名了 state 的一个属性,但忘记重命名 getDerivedStateFromProps 中的一个事件,因为 typescript 实际上并不知道它应该是相同的类型

例子:

interface IComponentState {
    property1: string;
    property2: number;
}

static getDerivedStateFromProps(
    props: IComponentProps, state: IComponentState) : IComponentState {
    if(some condition)
        return { property1: 'foo'}; // valid
    else
        return { property3: 'bar'}; // invalid, property3 does not exist on IComponentState

}

我必须如何指定 getDerivedStateFromProps 的返回类型才能使其工作。
IComponentState 中的所有属性标记为可选不是我想要的,我希望有另一种解决方案。

【问题讨论】:

  • 除了使用 Partial 的建议之外,如果 IComponentState 确实是具有两个 optional 属性的对象,那么您应该简单地将这些属性设为可选:@987654325 @.
  • @JBNizet:当然,但这里不是这样。
  • 那么 Partial 是你应该使用的。您不能返回 IComponentState,因为它的属性不是可选的。

标签: reactjs typescript


【解决方案1】:

你的意思是Partial<T>的用法吗?

interface IComponentState {
    property1: string;
    property2: number;
}

function getDerivedStateFromProps(props, state: IComponentState): Partial<IComponentState> {
    if (props)
        return { property1: 'foo' }; // valid
    else
        return { property3: 'bar' }; // invalid, property3 does not exist on IComponentState

}

【讨论】:

    【解决方案2】:

    解决方法是使用Partial&lt;T&gt;:

    static getDerivedStateFromProps(
        props: IComponentProps, state: IComponentState) : Partial<IComponentState> {
        if(some condition)
            return { property1: 'foo'}; // valid
        else
            return { property3: 'bar'}; // invalid, property3 does not exist on IComponentState
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 2019-08-14
      • 1970-01-01
      相关资源
      最近更新 更多