То, как я это прочитал, - это несоответствие между объявленным propTypes
в Query
компоненте и QueryProps
(реквизиты для этого компонента).Неверные реквизиты исправлены ниже (с оригинальным типом в комментариях):
export default class Query<TData = any, TVariables = OperationVariables> extends React.Component<QueryProps<TData, TVariables>> {
static propTypes: {
// ...
client: PropTypes.Requireable<ApolloClient<any>>; //PropTypes.Requireable<object>;
// ...
fetchPolicy: PropTypes.Requireable<FetchPolicy>; //PropTypes.Requireable<string>;
// ...
query: PropTypes.Validator<DocumentNode>; // PropTypes.Validator<object>;
};
}
Эта несовместимость обычно не имеет большого значения, за исключением случаев, когда вы пытаетесь создать HOC и используете React.ComponentType<P>
который подтверждает, что propTypes
и реквизиты находятся в согласии.
Самое простое решение (использование PR для реакции-apollo) заключается в использовании более слабого типа для WrappedComponent
, который не проверяет propTypes
.
С приведенным ниже определением код клиента работает, как и ожидалось:
interface WeakComponentClass<P = {}, S = React.ComponentState> extends React.StaticLifecycle<P, S> {
new (props: P, context?: any): React.Component<P, S>;
}
const withVerbose = <P extends any>(
WrappedComponent: WeakComponentClass<P> | React.FunctionComponent<P>
) =>
class extends React.Component<P> {
render() {
return (
<div>
{(this.props as any).query.loc.source.body}
<WrappedComponent {...this.props as P} />;
</div>
);
}
};
ПРИМЕЧАНИЕ: Я не решаюсь представить PR с исправленными типами, как будто они исправляют типизациюпроблема, они не точно отражают проверки во время выполнения, сделанные propTypes
.Возможно, лучшим подходом было бы изменить поведение Validator<T>
в самой реакции, чтобы оно не было ко-вариантным, а вместо этого было противоположным.
Используя это определение Validator
, реагирует-Аполлон работаеткак и ожидалось:
export interface Validator<T> {
(props: object, propName: string, componentName: string, location: string, propFullName: string): Error | null;
[nominalTypeHack]?: (p: T) => void; // originally T, now behaves contra-variantly
}