У меня есть проект 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.