typescript1.6 - چرا کامپایلر تایپاسکریپت اجازه نمیدهد نمونهای از کلاس را برگردانیم
در اینجا یک مثال برای توضیح یک مشکل وجود دارد:
اول من یک تعریف تایپاسکریپت برای ریاکت دارم که در آن تعریفی برای کامپوننت داریم:
class Component<P, S> implements ComponentLifecycle<P, S> {
static propTypes: ValidationMap<any>;
static contextTypes: ValidationMap<any>;
static childContextTypes: ValidationMap<any>;
static defaultProps: Props<any>;
constructor(props?: P, context?: any);
setState(f: (prevState: S, props: P) => S, callback?: () => any): void;
setState(state: S, callback?: () => any): void;
forceUpdate(callBack?: () => any): void;
render(): JSX.Element;
props: P;
state: S;
context: {};
refs: {
[key: string]: Component<any, any>
};
}
سپس در برنامه کلاسهایی ایجاد کردم که از Component ارثبری میکنند.
class App extends React.Component<any, any> {
}
و من میخواهم تابعی داشته باشم که یک نمونه از Component را برگرداند.
function Test<T extends React.Component<any, any>>(): T
{
return App;
}
کامپایلر تایپاسکریپت به من اجازه نمیدهد این کار را انجام دهم. خطا این است:
ویژگی 'setState' در نوع 'typeof App' وجود ندارد
من آن را نمیفهمم چون کلاس باید همه چیز را از کامپوننت به ارث ببرد.
پاسخ شماره ۱
شاید باید بنویسی
function Test<T extends React.Component<any, any>>(): T
{
return new App();
}
پاسخ شماره ۲
درست است! روز خیلی طولانیای برای من بود.
من هنوز چیزی را نمیفهمم. من tsd برای react-redux با تعاریف زیر دارم:
export interface ClassDecorator {
<T extends ComponentLifecycle<any, any>>(target:T): T;
}
export function connect(mapStateToProps?: MapStateToProps,
mapDispatchToProps?: MapDispatchToPropsFunction|MapDispatchToPropsObject,
mergeProps?: MergeProps,
options?: Options): ClassDecorator;
و در فایل دیگری که از آن استفاده میکنم، دارم
export default connect(
mapStateToProps,
mapDispatchToProps
)(App);
و دارد کار میکند. چرا نیازی نیست new App() را پاس بدهم؟؟ App همان کلاسی است که در سوال اول بود. ComponentLifecycle یک رابط است که توسط React.Component پیادهسازی شده است. وقتی ComponentLifecycle را در فایل tsd به Component تغییر میدهم، کد من کامپایل نمیشود.
