2017-01-06 2 views
2

У меня есть BaseComponent, который наследуется от React.Component. Все остальные компоненты приложения наследуются от BaseComponent. Мне нужно ввести BaseComponent, чтобы другие компоненты, наследуемые от него, обрабатывались как компоненты React потоком. Это то, что я в настоящее время:Как наследовать от пользовательского компонента React без потери информации о типе потока?

class BaseComponent<P, S> extends React.Component<$Shape<P>, P, S> { 
    ... 
} 

class OtherComponent extends BaseComponent { 
    props: {}; 
    state: {}: 
    ... 
} 

Вот working example. Правильно проверяет опоры, состояние и т. Д. В OtherComponent.

В BaseComponent, однако, я получаю непонятные ошибки:

  1. S: This type is incompatible with 'undefined. Did you forget to declare S?

  2. P: This type is incompatible with 'undefined. Did you forget to declare P?

  3. Did you forget to declare some incompatible instantiation of S ?: This type is incompatible with 'some incompatible instantiation of S '

Я пытаюсь понять сообщение об ошибках. Любая помощь будет принята с благодарностью.

+0

Вы параметризовали 'BaseComponent' с' P' и 'S'. Вам необходимо предоставить значения для этого, когда вы расширяете 'BaseComponent'. См. Https://flowtype.org/docs/classes.html#polymorphic-classes. –

+0

@FelixKling Спасибо! Я передаю значения типа. Я добавил пример flowtype.org/try, демонстрирующий проблему. Чтобы уточнить, что я делаю, поток корректно набирает 'OtherComponent', но показывает ошибки для' BaseComponent'. См. Рабочий пример. – alden

ответ

2

Это работает для меня:

class BaseComponent<D, P, S> extends React.Component<D, P, S> { 
    static defaultProps: D 
    props: P 
    state: S 
    yourCustomFunction(): void 
} 

class You extends BaseComponent<any, any, any> { 
    --- component body --- 
} 
+0

А, интересно. Повторная итерация реквизита/состояния/defaultProps в 'BaseComponent' действительно решает проблему. Тем не менее, '' alden

0

После большого количества экспериментов, это то, что я закончил с. Оказывается, для правильной работы:

class BaseComponent<Props:Object, State, DefaultProps: $Shape<Props>> extends React.Component<DefaultProps, Props, State> { 
    static defaultProps: $Abstract<DefaultProps>; 
    props: Props; 
    state: $Abstract<State>; 
} 

Ключ должен был определить реквизит/состояние/и defaultProps на baseComponent помимо прохождения Params типа до React.Components. Я не уверен, почему это необходимо, но это решает проблему.

+0

Вы должны включить соответствующий код непосредственно в свой ответ –

Смежные вопросы