Тип аннотации для функции, которая не предоставляет универсальный тип

Я использую react-native-navigation с @types/react-native-navigation, Это работает так, что все ваши зарегистрированные компоненты React Native автоматически получают this.props.navigator,

navigator имеет push метод, но он не допускает аргументов любого типа. У него есть свойство, которое называется passProps которые позволяют передавать свойства на страницу, к которой вы переходите, но нет способа аннотировать типы пропускаемых вами объектов, которые должны соответствовать опорам экрана, к которому вы переходите. Например:

export interface BioProps { username: string }
export class BioScreen extends React.Component<BioProps> {}

this.props.navigator.push({
  screen: 'bio.BioScreen',
  title: 'foo',
  passProps: {
    username,
  }
});

В этом случае я хочу passProps быть того же типа, что и BioProps для безопасности типа. Однако ничего подобного .push<BioProps> это позволило бы вам сделать это.

Есть ли способ обеспечить безопасность типов, если она не включена в определения?

1 ответ

Вы можете увеличить Navigator интерфейс из модуля, чтобы добавить общую перегрузку, которая будет обеспечивать props быть определенного типа:

// react-native-navigation-augmented.ts
import { Navigation, NavigationComponentProps } from 'react-native-navigation';
declare module 'react-native-navigation'{
    export interface Navigator {
        push<T>(params: PushedScreen & { passProps: T }): void
    }
}


// Otherfile.ts
/// <reference path="./react-native-navigation-augmented.ts" />
this.props.navigator.push<BioProps>({
    screen: 'bio.BioScreen',
    title: 'Pushed Screen',
    // Will cause an error if username is not present or of a different type
    passProps: {
        username: ""
    }
});
Другие вопросы по тегам