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 {
// ...
}
}