我想我的问题已经在某个地方解决了,但搜索一个小时后找不到。在我的react + mobx应用程序中,我想将动作定义与商店分开,以使其更易于监控和清洁。因此,我创建了一个装饰器以将动作混合到商店中。用javascript正常工作会使打字稿编译器抱怨该函数不存在。你能告诉我如何告诉打字稿我的行为吗?到目前为止,这是我的代码
// ./store-actions.js
import {action} from "mobx";
type Constructor<T = any> = new (...args: any[]) => T;
export function storeactions<T extends Constructor>(...actions: Function[]): (target: T) => T {
return function(target: T): T {
actions.forEach(fn => {
target.prototype[fn.name] = action.bound(target,fn.name,{
writable: false,enumerable: false,value: fn
});
});
return target;
};
}
// ./ui-store.js
import {observable} from 'mobx';
import {storeactions} from "../actions-decorator";
import {navigate} from "./navigate";
@storeactions(
navigate
)
export class UiStore {
@observable page: string = '';
}
export default new UiStore();
// ./Home.tsx
import React,{useState} from 'react';
import {observer} from 'mobx-react';
import uiStore from '../../stores/ui/store';
type Props = {
}
@observer
export class Home extends React.Component<Props> {
handlePageChange = (event: MouseEvent) => {
uiStore.navigate(event.target.value); // <<<<<<<<<<<<<<<< Fails because navigate doesn't exist
};
render() {
return (
<div classname="home">
Current Page: {uiStore.page}
<input type="radio" name="page" value="Login" onClick={this.handlePageChange} />
</div>
);
}
}
有什么主意吗?先谢了