Заставить функцию TypeScript принимать подключенный компонент Redux - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть проект React Native, где у меня есть класс Screen и классы HomeScreen, MyProfileScreen, полученные из него (я знаю, что композиция предпочтительнее наследования, но давайте оставим этот аргумент где-нибудь еще) (несущественные части отредактированы, но обратите внимание на функцию получения identifier, я подойду к этому):

export default class Screen<P = {},S = {},SS = {}> extends Component<P,S,SS> {
    static get identifier(){
        return this.name;
    }     
}

Затем на моем домашнем экране и экране профиля (который в основном имеет ту же структуру, что и домашний)screen):

export default class HomeScreen extends Screen<HomeScreenProps & HomeScreenDispatchProps>{
    [...]
}

Теперь я пишу функцию, в которой он принимает класс, производный от Screen, и обращаюсь к его статическому геттеру identifier:

export default function wrapStackNavigator<T extends typeof Screen>(screen:T){
    return <Stack.Navigator>
        <Stack.Screen name={screen.identifier} component={screen}/>
    </Stack.Navigator>
}

Итакпока все хорошо, я могу вызывать wrapStackNavigator с любыми классами экрана без ошибок типов. Теперь проблема начинается. Я хочу, чтобы мои экраны подключались к компонентам, поэтому я продолжаю и connect отправляем их в Redux как обычно:

export default connect(mapStateToProps, mapDispatchToProps, mergeProps)(HomeScreen)

На этом этапе звонки wrapStackNavigator начинают жаловаться на несовместимость типов. Я знаю причину: connect возвращает другой тип, который оборачивает исходный класс, но я не знаю, как это исправить. Я пытался изменить wrapStackNavigator, чтобы принять ConnectedComponent или InferableComponentEnhancerWithProps (что, по-видимому, connect возвращает), но безрезультатно (или я неправильно указал аргументы типа).

Как я могуmake wrapStackNavigator accept либо класс, производный от Screen, или a connect ed класс, производный от Screen, при этом все еще имея возможность доступа к статическим свойствам переданногопроизводный Screen класс, без опечаток? (и, пожалуйста, не приводите к any, я знаю, что это "решит" это, но я не считаю это решением). Я нахожусь на TypeScript 3.6.3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...