Typescript 如何为MapStateTops指定正确的返回类型?

Typescript 如何为MapStateTops指定正确的返回类型?,typescript,react-redux,Typescript,React Redux,在下面我的MapStateTops中,我想指定一个显式的TypeScript返回类型: interface CounterProps { sequence: number; count: number; } class Counter extends Component<CounterProps> { public static defaultProps = { sequence: 0, count: 0 };

在下面我的
MapStateTops
中,我想指定一个显式的TypeScript返回类型:

interface CounterProps {
    sequence: number;
    count: number;
}

class Counter extends Component<CounterProps> { 

    public static defaultProps = {
        sequence: 0,
        count: 0
    };

    public render() {
        const sequence = this.props.sequence
        const count = this.props.count

        return (
            // Some use of sequence, count ...
        )
    }
}

// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
const mapStateToProps = (state: CounterState) => ({
    count: state.count,
})
export default connect(mapStateToProps)(Counter)
调用
连接时TS2345失败(
计数器
不可分配给预期类型)

或者,将未返回的成员设置为可选的

interface CounterProps {
    sequence?: number;
    count: number;
}
允许

const mapStateToProps = (state: CounterState): CounterProps => ({
    count: state.count,
})
工作,但在
render
中使用
sequence
会导致TS2352(可能未定义)

如何为
mapstatetops
指定正确的返回类型,根据规范,它只需要返回相应类型的成员子集?

尝试
选择

由于您仅从
CounterProps
返回具有单个属性“
count
”的对象,因此您应该能够使用
Pick
作为
MapStateTrops
的返回类型

Pick
在基于现有状态改变状态时,通过回调调用
setState
也很有用。例如:

interface ComponentState {
  active: true;
  something: number;
  else: string;
}

class MyComponent extends React.Component<{}, ComponentState> {
  constructor(props) {
    super(props);

    this.state = { 
      active: false,
      something: 123,
      else: 'hello world',
    };
  }

  toggle(): void {
    this.setState((state: ComponentState): Pick<ComponentState, 'active'> ({
      active: !state.active,
    }));
  }

  render(): React.ReactElement {
    // ...
  }
}
接口组件状态{
主动:正确;
某物:数字;
其他:字符串;
}
类MyComponent扩展了React.Component{
建造师(道具){
超级(道具);
this.state={
活动:错误,
某物:123,
其他:'你好,世界',
};
}
toggle():void{
this.setState((状态:ComponentState):拾取({
活动:!state.active,
}));
}
render():React.ReactElement{
// ...
}
}

这是有道理的,但是为什么
部分
不起作用呢?那么
{}
组件
中的角色是什么(它打破了我的例子)?
{}
是一个描述
MyComponent
道具
。它是空的,因为我的示例组件没有任何道具。我无法确定为什么Partial不适用于您的用例,因为它在TypeScript 3.5.2上对我来说很好。您正在使用哪些编译器选项?
interface ComponentState {
  active: true;
  something: number;
  else: string;
}

class MyComponent extends React.Component<{}, ComponentState> {
  constructor(props) {
    super(props);

    this.state = { 
      active: false,
      something: 123,
      else: 'hello world',
    };
  }

  toggle(): void {
    this.setState((state: ComponentState): Pick<ComponentState, 'active'> ({
      active: !state.active,
    }));
  }

  render(): React.ReactElement {
    // ...
  }
}