Автоматический вывод типа для параметров свойств класса - PullRequest
0 голосов
/ 10 апреля 2019

Я использую библиотеку под названием apprun . Определение типа класса Component (здесь его реализация ) выглядит следующим образом:

  export type View<T> = (state: T) => string | VNode | VNode[] | void;

  export class Component<T=any> {
    constructor(state?: T, view?: View<T>, update?: Update<T>);
    readonly state: T;
    setState(state: T, options?: { render?: boolean, history?: boolean }): void;
    mount(element?: Element, options?: { render?: boolean, history?, global_event?: boolean }): Component<T>;
    start(element?: Element, options?: { render?: boolean, history?, global_event?: boolean }): Component<T>;
    on(name: string, fn: (...args: any[]) => void, options?: any): void;
    run(name: string, ...args: any[]): number;
    rendered: (state: T) => void;
    mounted: (props: any) => void;
    unmount: () => void;
    unload: () => void;
  }

Когда я использую этот класс в своих собственных компонентах, у меня возникают проблемы с выводом типа:

interface State {
  foo: string
}

export class AboutPage extends Component<State> {
  // State is correctly inferred.
  // Changing `foo` to be `1` will cause an error.
  state = {
    foo: 'bar'
  }

  // Parameter `state` implicitly has an 'any' type.
  // Why is the parameter not inferred just like the `state` property?
  view = (state) => <div>About</div>
}

У меня возникли проблемы с пониманием того, почему выводится тип свойства state и почему с параметром state?

не происходит то же самое.

1 Ответ

1 голос
/ 10 апреля 2019

Это потому, что state определено как свойство класса Component: readonly state: T.Но view определено только в вашем коде, где нет определения типа, поэтому его тип выводится из объявления view = (state) => <div>About</div>, поэтому (state: any) => JSX.Element.

Вы должны определить view: View<T> в вашемсобственный класс Component, который будет унаследован от Component, или определите тип аргумента state: state: State.

...